如题:比如打开记事本,输入 Borland ,打印,如何编程实现读取这个打印任务(这个文件)的内容:Borland请给提示或代码,delphi,c++均可.Thanks
解决方案 »
- 什么是事业?什么又是职业?
- lookup和计算列的问题
- 还是DES算法问题
- 哪位高手能提供点资料或源码,阐述DELPHI中编写和调用DLL和可视化控件,不胜感激!
- 数据库中的日期型字段例如:2003-2-27 9:45:12,在程序中使用TDateTime型的变量显示到文本框中无论如何都出不来时间,只有日期,成了2003
- 怎么在鼠标双击事件中取得鼠标当前位置?????
- SQL语句的写法,急…………
- 高级复制问题
- 程序非正常退出或者机器断电,数据丢失如何解决?
- 我从别处弄来的,看看吧:-)
- 关于delphi软件脱离环境运行?
- 一个奇怪的问题:将静态数组和动态数组写入二进制文件,产生成结果却不一样。
要提取内容,应该还要hook多几个api
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
这里好像有相关信息...
bResult := OpenPrinter(PChar(sPrinterName), hPrinter, Nil);if NOT bResult then beginShowMessage('Error opening the printer');exit;end;
bResult := EnumJobs(hPrinter,0,Length(aJobs),1,@aJobs,cbBuf,pcbNeeded,pcReturned);if NOT bResult then beginShowMessage('Error Getting Jobs information');exit;end;
for i:=0 to pcReturned-1 do beginif aJobs[i].pDocument <> Nil then beginSetLength(Result, Length(Result)+1);Result[Length(Result)-1] := aJobs[i];end;end;end;测试例子 :1- 创建工程有 StringGrid 和一个 Timer.2- StringGrid 'ColCount' and "RowCount" 值为 203- Timer 的 "Interval" 属性值 500.4- "OnTime" 实践中写这个代码 procedure TForm1.Timer1Timer(Sender: TObject);vari, ii : Integer;aJobs : JOB_INFO_1_ARRAY;beginfor i:=0 to StringGrid1.ColCount-1 dofor 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 beginStringGrid1.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 ofJOB_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;供参考,希望能帮上忙!