可用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;
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;
//从并行端口读取打印机状态
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;