一个简单的打印监控示例

{

关于打印监控,下面是一个简单的示例,可以监控到打印的任务信息。

}

unit FfrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls, Buttons,WinSpool;

type
  TfrmMain = class(TForm)
    ListView1: TListView;
    Panel1: TPanel;
    BitBtn2: TBitBtn;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    CurrentMachineName,CurrentUser,CurrentDocName,CurrentPrinter,CurrentPages: String;
    procedure PrintDetect;
    procedure SaveData;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.PrintDetect;
var
  tbt:Byte;
  PrinterNeeded,PrinterReturned,JobNeeded,JobReturned:DWORD;
  PrinterResultBuffer,JobResultBuffer:Pointer;
  PrinterCount,JobCount:Integer;
  PrinterInfo:PPrinterInfo1;         //打印机队列
  JobInfo:PJobInfo2;                 //打印任务队列
  hPrinter:THandle;
begin
  PrinterNeeded:=0;
  PrinterReturned:=0;
  EnumPrinters(PRINTER_ENUM_lOCAL,'',1,@tbt,0,PrinterNeeded,PrinterReturned);
  if PrinterNeeded<>0 then
  begin
    PrinterCount:=PrinterNeeded;
    GetMem(PrinterResultBuffer,PrinterCount);
    EnumPrinters(PRINTER_ENUM_lOCAL,'',1,PrinterResultBuffer,PrinterNeeded,PrinterNeeded,PrinterReturned);
    PrinterInfo:=PrinterResultBuffer;
    //当前打印机
    JobNeeded:=0;
    OpenPrinter(PrinterInfo^.pName,hPrinter,nil);
    EnumJobs(hPrinter,0,1,2,@tbt,0,JobNeeded,JobReturned);
    if JobNeeded<>0 then
    begin
      JobCount:=JobNeeded;
      GetMem(JobResultBuffer,JobCount);
      try
        //列举当前正在打印的任务
        EnumJobs(hPrinter,0,1,2,JobResultBuffer,JobNeeded,JobNeeded,JobReturned);
        JobInfo:=JobResultBuffer;
        {
        AtPrintEdit.Text:='计算机名:'+(JobInfo^.pMachineName)+
          ' 用户名:'+String(JobInfo^.pUserName)+
          ' 文档名:'+String(JobInfo^.pDocument);
        }
        if CurrentDocName<>JobInfo^.pDocument then
        begin
          if CurrentDocName<>'' then
            SaveData;
          CurrentMachineName:=JobInfo^.pMachineName;
          CurrentUser:=JobInfo^.pUserName;
          CurrentDocName:=JobInfo^.pDocument;
          CurrentPrinter:=JobInfo^.pPrinterName;
          CurrentPages:=InttoStr(JobInfo^.TotalPages);
        end;
      finally
        FreeMem(JobResultBuffer,JobCount);
      end;
    end
    else
    begin
      if CurrentDocName<>'' then
      begin
        SaveData;
        CurrentMachineName:='';
        CurrentUser:='';
        CurrentDocName:='';
        CurrentPrinter:='';
        CurrentPages:='';
      end;
    end;
    ClosePrinter(hPrinter);
  end;
end;

procedure TfrmMain.SaveData;
var
  ListItem:TListItem;
begin
  ListItem:=ListView1.Items.Add;
  ListItem.Caption:=CurrentMachineName;
  ListItem.SubItems.Add(CurrentUser);
  ListItem.SubItems.Add(DatetoStr(Date)+' '+TimeTostr(Time));
  ListItem.SubItems.Add(CurrentDocName);
  ListItem.SubItems.Add(CurrentPrinter);
  ListItem.SubItems.Add(CurrentPages);
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
  PrintDetect;
end;

end.

原文地址:https://www.cnblogs.com/GarfieldTom/p/1436142.html