2008-10-16 14 views
10

Po podłączeniu drukarki HP Laserjet 3015 system Windows wykrywa prawidłowy model, a następnie próbuje zainstalować odpowiednie sterowniki.Jak wykryć model drukarki w Delphi?

Jak wykryć model podłączonej drukarki (drukarek)? Nie chcę korzystać z listy zainstalowanych drukarek, ponieważ drukarkę Zebra można zainstalować przy użyciu sterownika Generic/Text only.

Jestem programistą Delphi i C#, więc wszelkie wskazówki w dowolnym języku będą mile widziane.

Odpowiedz

2

Niedawno zrobiłem z tego trochę demo. Wystarczy umieścić TComboBox i TMemo na formularzu i zastąpić kod z tego:

unit Unit1; 

interface 

uses 
    Windows, StdCtrls, Classes, Controls, Forms; 

type 
    TForm1 = class(TForm) 
    ComboBox1: TComboBox; 
    Memo1: TMemo; 
    procedure ComboBox1Change(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses 
    Printers, WinSpool, SysUtils; 

type 
    _DRIVER_INFO_6A = record 
    cVersion: DWORD; 
    pName: PAnsiChar;    
    pEnvironment: PAnsiChar;  
    pDriverPath: PAnsiChar;  
    pDataFile: PAnsiChar;   
    pConfigFile: PAnsiChar;  
    pHelpFile: PAnsiChar;   
    pDependentFiles: PAnsiChar; 
    pMonitorName: PAnsiChar;  
    pDefaultDataType: PAnsiChar; 
    pszzPreviousNames: PAnsiChar; 
    ftDriverDate: TFileTime; 
    dwlDriverVersion: Int64; 
    pszMfgName: PAnsiChar; 
    pszOEMUrl: PAnsiChar; 
    pszHardwareID: PAnsiChar; 
    pszProvider: PAnsiChar; 
    end; 
    TDriverInfo6A = _DRIVER_INFO_6A; 
    PDriverInfo6A = ^TDriverInfo6A; 
    PDriverInfo6 = PDriverInfo6A; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ComboBox1.Items.Assign(Printer.Printers); 
    ComboBox1.ItemIndex := 0; 
    ComboBox1Change(nil); 
end; 

function FileTimeToDateTime(ft: TFileTime): TDateTime; 
var 
    st: TSystemTime; 
    lt: TFileTime; 
begin 
    FillChar(st, SizeOf(st), 0); 
    FillChar(lt, SizeOf(lt), 0); 
    FileTimeToLocalFileTime(ft, lt); 
    FileTimeToSystemTime(lt, st); 
    result := SystemTimeToDateTime(st); 
end; 

procedure TForm1.ComboBox1Change(Sender: TObject); 
var 
    hPrinter: THandle; 
    PrtName: String; 
    DriverInfo: PDriverInfo6; 
    dwNeeded: DWORD; 
begin 
    Memo1.Clear; 
    PrtName := Combobox1.Text; 
    OpenPrinter(PChar(PrtName), hPrinter, nil); 
    DriverInfo := nil; 
    try 
    GetPrinterDriver(hPrinter, nil, 6, DriverInfo, 0, dwNeeded); 
    GetMem(DriverInfo, dwNeeded); 
    try 
     if GetPrinterDriver(hPrinter, nil, 6, DriverInfo, dwNeeded, dwNeeded) then begin 
     Memo1.Lines.Add('cVersion: ' + IntToStr(DriverInfo.cVersion)); 
     Memo1.Lines.Add('pName: '+StrPas(DriverInfo.pName)); 
     Memo1.Lines.Add('pEnvironment: '+StrPas(DriverInfo.pEnvironment)); 
     Memo1.Lines.Add('pDriverPath: '+StrPas(DriverInfo.pDriverPath)); 
     Memo1.Lines.Add('pDataFile: '+StrPas(DriverInfo.pDataFile)); 
     Memo1.Lines.Add('pConfigFile: '+StrPas(DriverInfo.pConfigFile)); 
     Memo1.Lines.Add('pHelpFile: '+StrPas(DriverInfo.pHelpFile)); 
     Memo1.Lines.Add('pDependentFiles: '+StrPas(DriverInfo.pDependentFiles)); 
     Memo1.Lines.Add('pMonitorName: '+StrPas(DriverInfo.pMonitorName)); 
     Memo1.Lines.Add('pDefaultDataType: '+StrPas(DriverInfo.pDefaultDataType)); 
     Memo1.Lines.Add('pszzPreviousNames: '+StrPas(DriverInfo.pszzPreviousNames)); 
     Memo1.Lines.Add('ftDriverDate: '+DateTimeToStr(FileTimeToDateTime(DriverInfo.ftDriverDate))); 
     Memo1.Lines.Add('dwlDriverVersion: '+IntToStr(DriverInfo.dwlDriverVersion)); 
     Memo1.Lines.Add('pszMfgName: '+StrPas(DriverInfo.pszMfgName)); 
     Memo1.Lines.Add('pszOEMUrl: '+StrPas(DriverInfo.pszOEMUrl)); 
     Memo1.Lines.Add('pszHardwareID: '+StrPas(DriverInfo.pszHardwareID)); 
     Memo1.Lines.Add('pszProvider: '+StrPas(DriverInfo.pszProvider)); 
     end else 
     Memo1.Lines.Add('No Info needed = ' + IntToStr(dwNeeded)); 
    finally 
     FreeMem(DriverInfo); 
    end; 
    finally 
    ClosePrinter(hPrinter); 
    end; 
end; 

end. 

edit: usunięty niepotrzebnych funkcji GetDriverNameByOSPrinterName

BTW: W pName masz nazwa sterownika nie nazwę drukarka. The Printername można zmienić w systemie Windows, więc jeśli chcesz się upewnić, użyj Printerdrivername.

+0

Przepraszam, musiałem unaccept odpowiedź. Nie chcę przechodzić przez infoscje kierowcy. Ponieważ drukarkę Zebra można przypisać do sterownika drukarki Tylko rodzaj/Tekst. Jeśli wybiorę sterownik drukarki "Generic/Text", chciałbym wiedzieć, że za nim jest Zebra. Przepraszamy. – vIceBerg

+0

.. ciąg dalszy ... Podobnie jak po podłączeniu drukarki do systemu Windows, może wykryć, która drukarka jest podłączona, nawet jeśli sterowniki nie są zainstalowane. Właśnie tego chcę wiedzieć. – vIceBerg

+0

uhm ... dunno, może uda ci się zdobyć tę informację w pewnej bibliotece USB, która ma wydarzenie hotplug lub coś podobnego –

5

można wysłać

~HI 

do drukarki Zebra i powinien powrócić swój numer modelu, a także Wersja FW