我要做一个打印机管理程序,来记录打印人、打印的份数等情况。
我使用了以下一个消息处理程序来监视打印机的状态,但是在有
打印任务来的时候,它更本没有反应啊,那位高手能解决?
..........
type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure WMSpollerStatus(var Msg:TWMSpoolerStatus); message WM_SPOOLERSTATUS;
    { Private declarations }
  public
    { Public declarations }
  end;.............procedure TForm1.WMSpollerStatus(var Msg: TWMSpoolerStatus);
var
  tbt:Byte;
  Needed,Returned:DWORD;
  ResultBuffer:Pointer;
  i,x,Count:Integer;
  Pi:PJobInfo1;
  List:TListBox;
  Lbl:TLabel;
begin
    Inherited;
    MessageBeep(0);
    EnumJobs(hPrinter,0,Msg.JobsLeft,1,@tbt,0,Needed,Returned);
    Count := Needed;
    GetMem(ResultBuffer,Count);
    try
      EnumJobs(hPrinter,0,Msg.JobsLeft,1,ResultBuffer,Needed,Needed,Returned);
      if Returned < Msg.JobsLeft then
      begin
        //Lbl.Caption:='0 个作业';
        Memo1.Lines.Add('0 个作业');
      //  Continue;
      end;
      //Lbl.Caption:=IntToStr(Returned)+' 个作业';
      Memo1.Lines.Add(IntToStr(Returned)+' 个作业');
      Pi:=ResultBuffer;
      for x:=0 to Returned-1 do begin
        //List.Items.Add(Pi^.pDocument);
        Memo1.Lines.Add(Pi^.pDocument);
        Pi:=PJobInfo1(LongInt(Pi)+Sizeof(Pi^));
      end;
    finally
      FreeMem(ResultBuffer,Count);
    end;  Msg.Result:=0;
end;.............

解决方案 »

  1.   

    完整代码如下,建立一个窗体,在上面放一个MEMO和BUTTON
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls,WinSpool,ExtCtrls;type
      TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        Memo1: TMemo;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        procedure WMSpollerStatus(var Msg:TWMSpoolerStatus); message WM_SPOOLERSTATUS;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      hPrinter:THandle;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMSpollerStatus(var Msg: TWMSpoolerStatus);
    var
      tbt:Byte;
      Needed,Returned:DWORD;
      ResultBuffer:Pointer;
      i,x,Count:Integer;
      Pi:PJobInfo1;
      List:TListBox;
      Lbl:TLabel;
    begin
        MessageBeep();
        EnumJobs(hPrinter,0,Msg.JobsLeft,1,@tbt,0,Needed,Returned);
        Count := Needed;
        GetMem(ResultBuffer,Count);
        try
          EnumJobs(hPrinter,0,Msg.JobsLeft,1,ResultBuffer,Needed,Needed,Returned);
          if Returned < Msg.JobsLeft then
          begin
            //Lbl.Caption:='0 个作业';
            Memo1.Lines.Add('0 个作业');
          //  Continue;
          end;
          //Lbl.Caption:=IntToStr(Returned)+' 个作业';
          Memo1.Lines.Add(IntToStr(Returned)+' 个作业');
          Pi:=ResultBuffer;
          for x:=0 to Returned-1 do begin
            //List.Items.Add(Pi^.pDocument);
            Memo1.Lines.Add(Pi^.pDocument);
            Pi:=PJobInfo1(LongInt(Pi)+Sizeof(Pi^));
          end;
        finally
          FreeMem(ResultBuffer,Count);
        end;  Msg.Result:=0;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var
      tbt:Byte;
      Needed,Returned:DWORD;
      ResultBuffer:Pointer;
      x,Count:Integer;
      Pi:PPrinterInfo1;
      Sheet:TTabSheet;
    //  hPrinter:THandle;
      Panel:TPanel;
      PrinterName : string;
    begin
    //  PrinterLst.Clear;
      EnumPrinters(PRINTER_ENUM_LOCAL,'',1,@tbt,0,Needed,Returned);
      if Needed=0 then Exit;
      Count:=Needed;
      GetMem(ResultBuffer,Count);
      EnumPrinters(PRINTER_ENUM_LOCAL,'',1,ResultBuffer,Needed,Needed,Returned);
      Pi:=ResultBuffer;
      for x:=0 to Returned-1 do begin
    //    PrinterLst.Items.Add(Pi^.pName);
        memo1.Lines.Add(Pi^.pName);
        PrinterName:=Pi^.pName;
        OpenPrinter(PChar(PrinterName),hPrinter,nil);    Pi:=PPrinterInfo1(LongInt(Pi)+Sizeof(Pi^));
        {
        Sheet:=TTabSheet.Create(Self);
        with Sheet do begin
          PageControl:=Pages;
          Caption:=PrinterLst.Items[PrinterLst.Items.Count-1];
          OpenPrinter(PChar(Caption),hPrinter,nil);
          Tag:=hPrinter;
          ClosePrinter(hPrinter);
          with TListBox.Create(Self) do begin
            Parent:=Sheet;
            Align:=alClient;
          end;
          Panel:=TPanel.Create(Self);
          with Panel do begin
            Parent:=Sheet;
            Align:=alTop;
            Height:=20;
            BevelOuter:=bvNone;
          end;
          with TLabel.Create(Self) do begin
            Parent:=Panel;
            Left:=10;
            Top:=3;
            Caption:='0 个作业';
          end;
     
        end;
    }
      end;
      FreeMem(ResultBuffer,Count);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Print();
    end;end.