现在有三台打印机,STAR NX100,STAR AR2400, EPSON LQ580K
在程序里怎分辩当前接着的打印机是哪一种?

解决方案 »

  1.   

    TPrinter类有打印机列表,看看它的相关属性
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    // This procedure enumates all printers on you computer.
    const
      Sub_Key = 'System\CurrentControlSet\Control\Print\Printers';
    var
      hPrinterKey : HKey;
      sKey : Array [0..255] of char;
      I : Integer;
      dwSize : Integer;
    begin
      if RegCreateKey(HKEY_CURRENT_CONFIG,Sub_Key,hPrinterKey) = ERROR_SUCCESS then
      begin
        I := 0;
        While (RegEnumKey(hPrinterKey,I,@sKey,255) = Error_Success) do
        begin
          Listbox1.Items.Add(sKey);
          I := I + 1;
        end;
        sKey := '';
        dwSize := 255;
        RegQueryValue(hPrinterKey,Sub_Key + '\Default',@sKey, dwSize);
        Listbox1.Items.Add(sKey);  end;
      RegCloseKey(hPrinterKey);
    end;
      

  3.   

    procedure TForm1.Button2Click(Sender: TObject);
    // This function is to show the default printer and its port.
    var
      iCount,iNumInfo : DWORD;
      Buffer : PChar;
      I : Integer;
    begin
      iCount := 0;
      EnumPrinters(PRINTER_ENUM_LOCAL,nil,5,nil,0,iCount,iNumInfo);  // Retrive buffer size.
      if iCount <> 0 then
      begin
        GetMem(Buffer,iCount);   // Set buffer size.
        if EnumPrinters(PRINTER_ENUM_LOCAL,nil,5,PByte(Buffer),iCount,iCount,iNumInfo) then
        begin
          For I := 0 to iNumInfo - 1 do
          begin
            if ((PPRINTERINFO5(Buffer)^.Attributes and PRINTER_ATTRIBUTE_DEFAULT) = PRINTER_ATTRIBUTE_DEFAULT) then
            begin
              Memo1.Lines.Add('Printer Name (Default): ' + PPRINTERINFO5(Buffer)^.pPrinterName);
              Memo1.Lines.Add('Printer Port : ' + PPRINTERINFO5(Buffer)^.pPortName);
            end;
            Inc(Buffer, sizeOf(TPRINTERINFO5));
          end;
        end;
        Buffer := Buffer - sizeOf(TPRINTERINFO5) * iNumInfo;
        FreeMem(Buffer,iCount);
      end;
    end;
      

  4.   

    但有个问题是,我是用直接输出到LPT1来打印的,WINDOWS不装驱动的,这些方法都只能在装了驱程下才行。
    还有,我不需要获取这三台的型号,也不要区分所有打印机的型号,我的真正需要只是打印机里有没有一些独有的标记,如
    NX100的:读出是 1
    AR2400的:读出的是 2
    LQ580K的:读出的是 3
    就可以了。
      

  5.   

    看看打印机控制语言:ESC PK指令集和PCL指令集吧。
    现在市面上多数打印机支持的是这两种打印控制语言,如Epson打印机使用的是ESC PK,Hp打印机使用的是PCL。 
    ESC PK我不太熟。
    PCL 在5.0版本之后才开始支持双向通讯,也就是说对于比较老的打印机,多数情况下是无法发送命令让打印机返回标志的,现在PCL最新版本为6.0。对于HP现在使用比较广泛,市面上流行的打印机,使用PCL就可以做到。你说的这个功能确实不是很好做,我曾经尝试过,至今没有好答案。最大的阻碍在于打印机厂家之间没有统一的打印控制语言,而且相同厂家不同版本的打印控制语言也不一样。
    现在我的解决方法是让用户手工挑选打印机。
    如果找到好的方法记得通知一声。good luck!
      

  6.   

    也通知我一声, 我还可以提供调用ESC的Delphi程序, 但没有完整的ESC指令集(我也在找)。
      

  7.   

    你要的ESC指令集我大把,NX100,AR2400,EPSON的都有