一个简单的打印监控示例

{



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



}



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.

 

你可能感兴趣的:(监控)