⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainformunit.~pas

📁 打印监控
💻 ~PAS
字号:
unit MainFormUnit;

interface

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

type
  TMainFrm = class(TForm)
    Timer1: TTimer;
    DBGrid1: TDBGrid;
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    AtPrintEdit: TEdit;
    Splitter1: TSplitter;
    Panel3: TPanel;
    procedure Timer1Timer(Sender: TObject);

    procedure SaveData;               //保存已打印任务
    procedure FormShow(Sender: TObject);


  private
    { Private declarations }
    CurrentMachineName,CurrentUser,CurrentDocName,CurrentPrinter: String;
    CurrentSize,CurrentPages:integer;
    procedure PrintDetect;
  public
    { Public declarations }
    procedure SpollerStatus(var Msg:TWMSpoolerStatus); message WM_SPOOLERSTATUS;
  end;

var
  MainFrm: TMainFrm;

implementation

uses MainDataModuleUnit;

{$R *.dfm}

procedure TMainFrm.SpollerStatus(var Msg:TWMSpoolerStatus);
begin
//  PrintDetect;
end;

procedure TMainFrm.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);
          CurrentPages:=JobInfo^.TotalPages;
          CurrentSize:=  JobInfo^.Size;

        end;
      finally
        FreeMem(JobResultBuffer,JobCount);
      end;
    end
    else
    begin
      if CurrentDocName<>'' then
      begin
        SaveData;
        CurrentMachineName:='';
        CurrentUser:='';
        CurrentDocName:='';
        CurrentPrinter:='';
        CurrentPages:=0;
        CurrentSize:=0;
        AtPrintEdit.Clear;
      end;
    end;
    ClosePrinter(hPrinter);
  end;
end;

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

procedure TMainFrm.SaveData;
begin
  MainDataModule.MainAdoDataset.close;
  MainDataModule.MainAdoDataset.CommandText:='Select * from PrinterData';
  MainDataModule.MainAdoDataset.Open;
  MainDataModule.MainADODataSet.Last;
  with MainDataModule.MainADODataSet do
  begin
      Insert;
      FieldByName('计算机名').asString:=CurrentMachineName;
      FieldByName('用户名').asString:=CurrentUser;
      FieldByName('时间').asDateTime:=StrtoDateTime(DatetoStr(Date)+' '+TimeTostr(Time));
      FieldByName('文档名称').asString:=CurrentDocName;
      FieldByName('打印机').asString:=CurrentPrinter;
//      FieldByName('端口').asString:=CurrentPort;
//      FieldByName('字节大小').asInteger:=StrToInt(CurrentSize);
      FieldByName('字节大小').asInteger:=CurrentSize;
      FieldByName('打印页数').asInteger:=CurrentPages;
      Post;
   //   Refresh ;
  end;

end;


procedure TMainFrm.FormShow(Sender: TObject);
var
  TimeStr: String;
begin
  TimeStr:=DatetoStr(Date)+' '+TimeTostr(Time);
  MainDataModule.MainAdoDataset.close;
  MainDataModule.MainAdoDataset.CommandText:='Select * from PrinterData';
  MainDataModule.MainAdoDataset.Open;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -