首页  编辑  

获取打印机的打印任务列表

Tags: /超级猛料/Print.打印/   Date Created:

如何在程序里判断一个打印作业已经进入打印队列(也就是可以在打印管理程序里看到该作业的信息),或者说如何察看打印队列里已有的作业信息?

看下面的这个例程。还有测试代码。

uses WinSpool;

type JOB_INFO_1_ARRAY = Array of JOB_INFO_1;

Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY;

var

i : Integer;

hPrinter : THandle;

bResult : Boolean;

cbBuf : DWORD;

pcbNeeded : DWORD;

pcReturned : DWORD;

aJobs : Array[0..99] of JOB_INFO_1;

begin

cbBuf := 1000;

bResult := OpenPrinter(PChar(sPrinterName), hPrinter, Nil);

if NOT bResult then begin

ShowMessage('Error opening the printer');

exit;

end;

bResult := EnumJobs(hPrinter,0,Length(aJobs),1,@aJobs,cbBuf,pcbNeeded,pcReturned);

if NOT bResult then begin

ShowMessage('Error Getting Jobs information');

exit;

end;

for i:=0 to pcReturned-1 do begin

if aJobs[i].pDocument <> Nil then begin

SetLength(Result, Length(Result)+1);

Result[Length(Result)-1] := aJobs[i];

end;

end;

end;

测试例子:

1- 创建工程有 StringGrid 和一个 Timer.

2- StringGrid 'ColCount' and "RowCount" 值为 20

3- Timer的 "Interval" 属性值 500.

4- "OnTime" 实践中写这个代码

procedure TForm1.Timer1Timer(Sender: TObject);

var

i, ii : Integer;

aJobs : JOB_INFO_1_ARRAY;

begin

for i:=0 to StringGrid1.ColCount-1 do

for ii:=0 to StringGrid1.RowCount-1 do StringGrid1.Cells[i,ii] := '';

aJobs := GetSpoolerJobs('\\ibmserver\HP LaserJet 1100');//正在打印的打印机名字,这里我的打印机时网打。这里你要自己改

for i:=0 to Length(aJobs)-1 do begin

StringGrid1.Cells[i,0] := aJobs[i].pPrinterName;

StringGrid1.Cells[i,1] := aJobs[i].pMachineName;

StringGrid1.Cells[i,2] := aJobs[i].pUserName;

StringGrid1.Cells[i,3] := aJobs[i].pDocument;

StringGrid1.Cells[i,4] := aJobs[i].pDatatype;

StringGrid1.Cells[i,5] := aJobs[i].pStatus;

StringGrid1.Cells[i,6] := IntToStr(aJobs[i].Status);

case aJobs[i].Status of

JOB_STATUS_PAUSED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAUSED';

JOB_STATUS_ERROR: StringGrid1.Cells[i,6] := 'JOB_STATUS_ERROR';

JOB_STATUS_DELETING: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETING';

JOB_STATUS_SPOOLING: StringGrid1.Cells[i,6] := 'JOB_STATUS_SPOOLING';

JOB_STATUS_PRINTING: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTING';

JOB_STATUS_OFFLINE: StringGrid1.Cells[i,6] := 'JOB_STATUS_OFFLINE';

JOB_STATUS_PAPEROUT: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAPEROUT';

JOB_STATUS_PRINTED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTED';

JOB_STATUS_DELETED: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETED';

JOB_STATUS_BLOCKED_DEVQ: StringGrid1.Cells[i,6] := 'JOB_STATUS_BLOCKED_DEVQ';

JOB_STATUS_USER_INTERVENTION: StringGrid1.Cells[i,6] := 'JOB_STATUS_USER_INTERVENTION';

JOB_STATUS_RESTART: StringGrid1.Cells[i,6] := 'JOB_STATUS_RESTART';

JOB_POSITION_UNSPECIFIED: StringGrid1.Cells[i,6] := 'JOB_POSITION_UNSPECIFIED';

else StringGrid1.Cells[i,6] := 'Unknown status...';

end;

end;

StringGrid1.Refresh;

end;

5- 运行程序,打印程序测之

OK

⌒_⌒