Delphi控制打印机

1、          获取打印机状态信息

 

下面的代码可以判断所选打印机是否支持双面打印。如返回值为1,则表示支持双面打

印,返回值为0则表示不支持。

DeviceCapabilitiesA(Device,Port,DC_DVPLEX,nil,nil);

下面的代码可以获得一个打印机最多能复制的份数:

DeviceCapabilitiesA(Device,Port,DC_COPIES,nil,nil);

使用GetDeviceCaps()函数确定所选设备的特定属性。在某些情况下,GetDeviceCaps()将返回所需

要的值。下面的代码以毫米为单位返回打印机设备的宽度:

GetDeviceCaps(Printer.Handle,HORISIZE);

在另一些情况下,GetDeviceCaps()返回一个整数,这个整数经过位屏蔽可以获得打印机的某一性

能。例如,GetDeviceCaps()方法返回这样的整型值:

RCaps:=GetDeviceCaps(Printer.Handle,RASTERCAPS);

然后,通过AND运算符屏蔽出RC_BANDING字段,进而确定打印机是否支持分段打印技术。

(RCapsandRC_BANDING)=RC_BANDING

***************

获取打印机状态信息

var

pinfo:pPRINTERINFO2;

pprt,a:Cardinal;

b:PDWORD;

begin

b:=allocmem(256);

pinfo:=AllocMem(1000);

ifOpenPrinter('HP DJ 200',pprt,nil) then

begin

a:=1000;

ifgetprinter(pprt,2,pinfo,a,b) then

showmessage(pinfo.pPrinterName+'ststus:'+inttostr(pinfo.Status));

ClosePrinter(pprt);

end;

 

freemem(b);

freemem(pinfo);

end;

 

PRINTER_INFO_2.Status:

Windows NT:

PRINTER_STATUS_PAUSED

PRINTER_STATUS_PENDING_DELETION

Windows 95:

PRINTER_STATUS_BUSY

PRINTER_STATUS_DOOR_OPEN

PRINTER_STATUS_ERROR

PRINTER_STATUS_INITIALIZING

PRINTER_STATUS_IO_ACTIVE

PRINTER_STATUS_MANUAL_FEED

PRINTER_STATUS_NO_TONER

PRINTER_STATUS_NOT_AVAILABLE

PRINTER_STATUS_OFFLINE

PRINTER_STATUS_OUT_OF_MEMORY

PRINTER_STATUS_OUTPUT_BIN_FULL

PRINTER_STATUS_PAGE_PUNT

PRINTER_STATUS_PAPER_JAM

PRINTER_STATUS_PAPER_OUT

PRINTER_STATUS_PAPER_PROBLEM

PRINTER_STATUS_PAUSED

PRINTER_STATUS_PENDING_DELETION

PRINTER_STATUS_PRINTING

PRINTER_STATUS_PROCESSING

PRINTER_STATUS_TONER_LOW

PRINTER_STATUS_UNAVAILABLE

PRINTER_STATUS_USER_INTERVENTION

PRINTER_STATUS_WAITING

PRINTER_STATUS_WARMING_UP

 

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、用API直接打印

uses CommDlg;

 

{$IFNDEF WIN32}

const MAX_PATH = 144;

{$ENDIF}

 

procedure TForm1.Button1Click(Sender: TObject);

var

Pd : TPrintDlg;

DocInfo: TDocInfo;

begin

FillChar(Pd, sizeof(Pd), #0);

Pd.lStructSize := sizeof(Pd);

Pd.hWndOwner := Form1.Handle;

Pd.Flags := PD_RETURNDC;

if PrintDlg(pd) then begin

FillChar(DocInfo, sizeof(DocInfo), #0);

DocInfo.cbSize := SizeOf(DocInfo);

GetMem(DocInfo.lpszDocName, 32);

GetMem(DocInfo.lpszOutput, MAX_PATH);

lStrCpy(DocInfo.lpszDocName, 'My Document');

{Add this line to print to a file }

lStrCpy(DocInfo.lpszOutput, 'C:\Download\Test.doc');

StartDoc(Pd.hDc, DocInfo);

StartPage(Pd.hDc);

TextOut(Pd.hDc, 100, 100, 'Page 1', 6);

EndPage(Pd.hDc);

StartPage(Pd.hDc);

TextOut(Pd.hDc, 100, 100, 'Page 2', 6);

EndPage(Pd.hDc);

EndDoc(Pd.hDc);

FreeMem(DocInfo.lpszDocName, 32);

FreeMem(DocInfo.lpszOutput, MAX_PATH);

end;

end;

 

4、获取打印页边距

 

uses Printers;

 

procedure TForm1.Button1Click(Sender: TObject);

var

EscapeCode : integer;

Margin : TPoint;

begin

if PrintDialog1.Execute then begin

{$IFDEF WIN32}

Margin.x :=GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);

Margin.y :=GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);

{$ELSE}

EscapeCode := GETPRINTINGOFFSET;

if Escape(Printer.Handle,

QUERYESCSUPPORT,

sizeof(EscapeCode),

@EscapeCode,

nil) <> 0 then

if Escape(Printer.Handle,

GETPRINTINGOFFSET,

0,

nil,

@Margin) < 1 then begin

EscapeCode := GETPHYSPAGESIZE;

if Escape(Printer.Handle,

QUERYESCSUPPORT,

sizeof(EscapeCode),

@EscapeCode,

nil) <> 0 then

if Escape(Printer.Handle,

GETPHYSPAGESIZE,

0,

nil,

@Margin) > 0 then begin

Margin.x := (Margin.x -

GetDeviceCaps(Printer.Handle, HorzRes)) div 2;

Margin.y := (Margin.y -

GetDeviceCaps(Printer.Handle, VertRes)) div 2;

end else begin

Margin.x := 0;

Margin.y := 0;

end;

end;

{$ENDIF}

Memo1.Lines.Add(IntToStr(Margin.x));

Memo1.Lines.Add(IntToStr(Margin.y));

end;

end;

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值