How to detect the printer model in Delphi?

前端 未结 2 785
醉梦人生
醉梦人生 2021-02-08 13:17

When I plug my HP Laserjet 3015, Windows detects the correct model and then tries to install the appropriate drivers.

How can I detect the model of connected printer(s)?

2条回答
  •  春和景丽
    2021-02-08 13:24

    Recently I made a little demo with this. Just put a TComboBox and a TMemo on a Form and replace the code with this:

    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: removed the unnecessary function GetDriverNameByOSPrinterName

    BTW: In pName you have the Name of the Driver not the Name of the Printer. The Printername is changeable in Windows, so if you want go sure, use the Printerdrivername.

提交回复
热议问题