Перехватывать печать на принтере

Материал из DRKB


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSpool;

type
  TForm1 = class(TForm)
    btnStart: TButton;
    cbPrinters: TComboBox;
    procedure btnStartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  PrintersInfo: array of TPrinterInfo5;
  I, Needed, Returned: DWORD;
begin
  EnumPrinters(PRINTER_ENUM_LOCAL, nil, 5, nil, 0, Needed, Returned);
  SetLength(PrintersInfo, Needed div SizeOf(TPrinterInfo5));
  if EnumPrinters(PRINTER_ENUM_LOCAL, nil, 5, PrintersInfo, Needed, Needed, Returned) then
    if Returned > 0 then
    begin
      for I := 0 to Returned - 1 do
        cbPrinters.Items.Add(PrintersInfo[I].pPrinterName);
      btnStart.Enabled := True;
      cbPrinters.ItemIndex := 1;
    end;
end;

procedure TForm1.btnStartClick(Sender: TObject);
var
  hPrinter, hChanges: THandle;
  NotifyOption: TPrinterNotifyOptions;
  NotifyTipes: TPrinterNotifyOptionsType;
  Field: TPrinterNotifyInfoData;
begin
  if OpenPrinter(PChar(cbPrinters.Items.Strings[cbPrinters.ItemIndex]), hPrinter, nil) then
  try
    NotifyTipes.wType := JOB_NOTIFY_TYPE;
    NotifyTipes.Reserved0 := 0;
    NotifyTipes.Reserved1 := 0;
    NotifyTipes.Reserved2 := 0;
    NotifyTipes.Count := 1;
    NotifyTipes.pFields := @Field;

    NotifyOption.Version := 2;
    NotifyOption.Flags := PRINTER_CHANGE_ALL;
    NotifyOption.Count := 1;
    NotifyOption.pTypes := @NotifyTipes;

    hChanges := FindFirstPrinterChangeNotification(hPrinter, PRINTER_CHANGE_ALL, 0, @NotifyOption);
    if hChanges = INVALID_HANDLE_VALUE then
      RaiseLastOSError
    else
    try
      case WaitForSingleObject(hChanges, INFINITE) of
        WAIT_OBJECT_0: ShowMessage('Есть изменения');
        WAIT_FAILED: RaiseLastOSError;
      end;
    finally
      FindClosePrinterChangeNotification(hChanges);
    end;
  finally
    ClosePrinter(hPrinter);
  end;
end;

end.


Author: Rouse_
Source: Взято из http://forum.sources.ru
ID: 03255