Перехватывать печать на принтере |
Previous Top Next |
Code: |
unit Unit1;
{©Drkb v.3(2007): www.drkb.ru}
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. |
©Drkb::03255
Взято из http://forum.sources.ru
Автор: Rouse_