如题:比如打开记事本,输入 Borland ,打印,如何编程实现读取这个打印任务(这个文件)的内容:Borland请给提示或代码,delphi,c++均可.Thanks

解决方案 »

  1.   

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

  2.   

    用wmi就可以:unit wmi;interfaceuses
      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
      

  3.   

    http://support.microsoft.com/kb/q160129/
    这里好像有相关信息...
      

  4.   

    查看打印队列里已有的作业信息:uses WinSpool;type JOB_INFO_1_ARRAY = Array of JOB_INFO_1;Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY;vari : Integer;hPrinter : THandle;bResult : Boolean;cbBuf : DWORD;pcbNeeded : DWORD;pcReturned : DWORD;aJobs : Array[0..99] of JOB_INFO_1;begincbBuf := 1000;
    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;供参考,希望能帮上忙!