请问如何获得打印机状态?比如是否联机

解决方案 »

  1.   

    不知道有用没有?
    unit Unit1;interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs,printers, StdCtrls, Grids, Buttons;type
      TForm1 = class(TForm)
        grid: TStringGrid;
        BitBtn1: TBitBtn;
        procedure FormCreate(Sender: TObject);
      private
        { Private-Deklarationen }
      public
        { Public-Deklarationen }
      end;const  techno : array[0..6] of string =   ('Plotter','Grid-screen',
       'Grid-printer','?',
       'Sign-printer','Metafile',
       '?');
    var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var dc : THandle;
        i : integer;
        n : integer;begin
       grid.ColWidths[1] := 200;
       dc := printer.handle;
       i:= 0;
       grid.cells[0,i] := 'Name';
       grid.cells[1,i] := printer.printers[printer.printerindex];
       inc(i);
       grid.cells[0,i] := 'Driver-version';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, driverversion));
       inc(i);
       grid.cells[0,i] := 'Technology';
       grid.cells[1,i] := techno[GetDeviceCaps(dc, technology)];
       inc(i);
       grid.cells[0,i] := 'Printwidth(mm)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, horzsize));
       inc(i);
       grid.cells[0,i] := 'PrintHeight (mm)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, vertsize));
       inc(i);
       grid.cells[0,i] := 'Width (Pixel)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, horzres));
       inc(i);
       grid.cells[0,i] := 'Hight (Pixel)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, vertres));
       inc(i);
       grid.cells[0,i] := 'Page-offset left (Pixel)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, PHYSICALOFFSETX));
       inc(i);
       grid.cells[0,i] := 'Page-offset top (Pixel)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, PHYSICALOFFSETY));
       inc(i);
       grid.cells[0,i] := 'DPI (horizontal)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, logpixelsx));
       inc(i);
       grid.cells[0,i] := 'DPI (vertical)';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, logpixelsy));
       inc(i);
       grid.cells[0,i] := 'Brush';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, Numbrushes));
       inc(i);
       grid.cells[0,i] := 'Pen';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, numpens));
       inc(i);
       grid.cells[0,i] := 'Marker';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, numers));
       inc(i);
       grid.cells[0,i] := 'Colors';
       grid.cells[1,i] := IntToStr(GetDeviceCaps(dc, numcolors));
       inc(i);
       grid.cells[0,i] := 'Fonts';
       grid.cells[1,i] := IntToStr(printer.Fonts.count);
       inc(i);
       for n := 0 to printer.Fonts.count-1 do 
       begin
          grid.rowcount := i;
          grid.cells[1,i] := printer.Fonts[n];
          inc(i);
       end;
    end;
      

  2.   

    可用CREATEFILE以PRN为文件名生成一个文件,检测返回值,若成功则打印机可用,否则显示打印机故障。生成关于PRN的文件句柄后,可象普通文件一样向文件写入内容,比如WRITE,写完后关闭文件。
    //从并行端口读取打印机状态
    function GetPrinterStatus:byte;
    asm
      MOV DX,$379;
      IN AL,DX;
    end;
    //获取打印机是否出错
    function CheckPrinter:boolean;
    var
      temp:byte;
    begin
      temp:=GetPrinterStatus;
      Result:=not ( ((temp and $80)=0) //打印机忙
      or ((temp and $20)<>0)  //打印机缺纸
      or ((temp and $10)=0)    //打印机未联机
      or ((temp and $08)=0) ); //打印机出错;
    end;
      

  3.   

    如果打印机是USB接口的呢?