如何读取打印任务队列中需要打印的文件的内容???!!!

纯冰糖 2006-04-13 03:49:49
如题:比如打开记事本,输入 Borland ,打印,如何编程实现读取这个打印任务(这个文件)的内容:Borland

请给提示或代码,delphi,c++均可.Thanks
...全文
720 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
纯冰糖 2006-05-11
  • 打赏
  • 举报
回复
自己 UP!
fishday36 2006-04-14
  • 打赏
  • 举报
回复
查看打印队列里已有的作业信息:

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;

供参考,希望能帮上忙!

bluesky23 2006-04-14
  • 打赏
  • 举报
回复
友情UP
纯冰糖 2006-04-14
  • 打赏
  • 举报
回复
自己 up 一下吧,有点着急
纯冰糖 2006-04-14
  • 打赏
  • 举报
回复
自己 up 一下吧,有点着急
GARNETT2183 2006-04-13
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/q160129/
这里好像有相关信息...
柯本 2006-04-13
  • 打赏
  • 举报
回复
晕,看错了,以为是得到文档名,
这个问题以前有人提过,找一下
柯本 2006-04-13
  • 打赏
  • 举报
回复
用wmi就可以:

unit wmi;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
ActiveX, WbemScripting_TLB;
function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;
var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll';

procedure DumpWMI_Process(Process: SWBemObject);
var
Enum: IEnumVARIANT;
varArr: OleVariant;
lNumElements: ULong;
SProp: ISWbemProperty;
Prop: OleVariant;
PropName: string;
PropType: string;
PropValue: string;
begin
Form1.Memo1.Lines.Add('+ WMI Path: ' + Process.Path_.Path);
Enum := Process.Properties_._NewEnum as IEnumVariant;
while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and
(lNumElements > 0) do
begin
if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and
Assigned(SProp) then
begin
try
PropName := SProp.Name;
Prop := SProp.Get_Value;
PropType := inttostr((VarType(Prop)));
PropValue := VarToStr(Prop);
Form1.Memo1.Lines.Add(' + ' + PropName + '[' + PropType + '] = ' + PropValue);
except
on E: Exception do
begin
// WriteLn(ErrOutput, PropName, ': ', E.Message);
end;
end;
end;
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
Server: string;
Enum: IEnumVARIANT;
varArr: OleVariant;
lNumElements: ULong;
AName: array[0..255] of Char;
ASize: DWORD;
begin
if (ParamCount = 0) then
begin
Server := '';
ASize := SizeOf(AName) - 1;
if GetComputerName(@AName, ASize) then Server := AName;
end
else
begin
Server := ParamStr(1);
end;
try
Memo1.Lines.BeginUpdate;
Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
'', '', '', 0, nil).ExecQuery('Select Document from Win32_PrintJob', 'WQL',
wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and
(lNumElements > 0) do
begin
DumpWMI_Process(IUnknown(varArr) as SWBemObject);
end;
finally
Memo1.Lines.EndUpdate;
end;
end;

end.
//其中WbemScripting_TLB.pas在http://www.truth4all.org/WbemScripting_TLB.pas
纯冰糖 2006-04-13
  • 打赏
  • 举报
回复
自己 up 一下吧,有点着急
纯冰糖 2006-04-13
  • 打赏
  • 举报
回复
感觉有些麻烦,我仔细看看
aiirii 2006-04-13
  • 打赏
  • 举报
回复
http://www.madcodehook.com/madCodeHookDescription.htm

安装后,它的demo有一个打印hook, 不过,代码好像只是hook打印任务列表,
要提取内容,应该还要hook多几个api

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧