2008-10-16 6 views
10

Lorsque je branche mon HP LaserJet 3015, Windows détecte le modèle correct, puis essaie d'installer les pilotes appropriés.Comment détecter le modèle d'imprimante dans Delphi?

Comment puis-je détecter le modèle d'imprimante (s) connectée (s)? Je ne souhaite pas utiliser la liste des imprimantes installées car une imprimante Zebra peut être installée avec un pilote générique/texte uniquement. Je suis un programmeur Delphi et C#, donc des conseils dans n'importe quelle langue seront appréciés.

Répondre

2

Récemment j'ai fait une petite démo avec ceci. Il suffit de mettre un TComboBox et un TMemo sur un formulaire et remplacer le code avec ceci:

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. 

modifier: suppression de la fonction inutile GetDriverNameByOSPrinterName

BTW: En pName vous avez le nom du pilote pas le nom de L'imprimante. Le Printername est modifiable dans Windows, donc si vous voulez être sûr, utilisez le nom d'utilisateur de l'imprimante.

+0

Je suis désolé, je devais votre réponse non acceptable. Je ne veux pas passer en revue les informations du conducteur. Parce qu'une imprimante Zebra peut être mappée à un pilote d'imprimante générique/texte seulement. Si je choisis le pilote d'imprimante "Générique/Texte", je voudrais savoir que c'est un Zebra derrière. Désolé. – vIceBerg

+0

.. suite ... Comme lorsque vous connectez une imprimante sous Windows, elle peut détecter quelle imprimante est connectée, même si les pilotes ne sont pas installés. C'est ce que je veux savoir. – vIceBerg

+0

euh ... peut-être que vous pouvez obtenir cette information avec une bibliothèque USB, qui a un événement hotplug ou quelque chose comme ça –

5

Vous pouvez envoyer un

~HI 

à l'imprimante Zebra et il devrait retourner son numéro de modèle et aussi la version fw

Questions connexes