Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как поймать событие ONPRINT ?


AP3AMAC ©   (2004-09-28 16:15:00) 

Пробовал вот так:

type
 TForm1 = class(TForm)
   Label1: TLabel;
 private
   { Private declarations }
   procedure WM_Print(var Msg: TWMPRINT);
     message WM_PRINT;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WM_PRINT(var Msg: TWMPRINT);
begin
 Label1.Caption := 'print';
 msg.Result := 0;
end;

Но поймать это событие и остановить печать не удаётся.


nomshar   (2004-09-30 20:09:00) [1]

Это не сложно. Пишем следующее.

// наша Call-back функция
function TForm1.myAbortProc(hdc: HDC; iError: interger): BOOL;
begin
// Останавливаем печать и очищаем очередь
// Предварительно проверим на ошибки
if iError = 0 then AbortDoc(hdc);
// Мы же хотим закончить текущую работу принтера, значит возвращаем FALSE
result:= false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var pd: THandle;
begin
OpenPrinter('hp deskjet 930c series', pd, 0);
if pd <> 0 then
 if SetAbortProc(pd.DC, @TForm1.myAbortProc) = SP_ERROR then
  ShowMessage(intToStr(GetLastError)); // знаю, плохая обработка ошибок, но для примера сойдет.
end;



Сразу скажу, код этот я не проверял. Написал по логике действий и может где-то есть косяк. Но в принципе все делал по MSDN, надеюсь, это все сработает.
И кстати, функция myAbortProc вызывается только тогда, когда работа принтера должна быть завершена в течении постановки в очередь, либо печати (кажется, правильно перевел, хе). Так что может я и зря в функции поставил AbortDoc. Можно, думаю, просто вернуть false и не заморачиваться. Но ты попробуй оба варианта.


AP3AMAC   (2004-09-29 21:44:00) [2]


> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_7mgj.asp
> Попробуй зайти сюда.

Попробовал.

Сделал следующее:

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

procedure TForm1.FormCreate(Sender: TObject);
begin
 OpenPrinter('hp deskjet 930c series',N,0);
end;

procedure TForm1.WM_SpoolerStatus(var Msg: TWMSPOOLERSTATUS);
begin
AbortPrinter(N);
end;

Толку опять никакого. Ещё там упоминается функция AbortProc:
AbortProc
The AbortProc function is an application-defined callback function used with the SetAbortProc function. It is called when a print job is to be canceled during spooling. The ABORTPROC type defines a pointer to this callback function. AbortProc is a placeholder for the application-defined function name.

Но как ею воспользоваться я не понял.


nomshar   (2004-09-29 19:48:00) [3]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_7mgj.aspПопробуй зайти сюда.


AP3AMAC   (2004-09-29 19:34:00) [4]


> я бы не стал надеятся на WM_SPOOLERSTATUS.

Не имеет значения, будет ли это WM_SPOOLERSTATUS или что-то ещё.
Главное предотвратить печать, а не останавливать её во время работы.


> Могу ошибаться, но в данном случае лучше бы следить за изменением
> содержимого папки %windir%\spool\PRINTERS, поймав уведомление
> о создании очередного файла запрашивать инфу о всех заданиях,
> ну а дальше - приостанавливать задание, запрашивать пароль,
> и, если он не введен или введен неправильно, убивать задание.

Что подразумевается под словами "все задания"? И насколько я понимаю, если файл создался, значит процесс печати, по сути, уже начался. Туманно всё как-то.


nomshar   (2004-09-29 19:08:00) [5]

Почитал по поводу WM_SPOOLERSTATUS в MSDN. Про это сообщение сказано, что оно является лишь информативным и не гарантирует доставку и обрабатывать события PrinterManager на основе его не стоит.


simpson   (2004-09-29 18:54:00) [6]

> Мне нужно перехватить попытку печати именно на Win98

Раритет, однако. :)
Судя вот по этому:

This message is for informational purposes only. This message is advisory and does not have guaranteed delivery semantics. Applications should not assume that they will receive a WM_SPOOLERSTATUS message for every change in spooler status.

я бы не стал надеятся на WM_SPOOLERSTATUS.

Могу ошибаться, но в данном случае лучше бы следить за изменением содержимого папки %windir%\spool\PRINTERS, поймав уведомление о создании очередного файла запрашивать инфу о всех заданиях, ну а дальше - приостанавливать задание, запрашивать пароль, и, если он не введен или введен неправильно, убивать задание.


AP3AMAC   (2004-09-29 17:42:00) [7]

Насколько я понимаю "FindFirstPrinterChangeNotification
FindNextPrinterChangeNotification
FindClosePrinterChangeNotification
" работают под WinXP. Их аналог под Win98 - WM_SPOOLERSTATUS. Мне нужно перехватить попытку печати именно на Win98. WM_SPOOLERSTATUS ловится, но пользы от этого никакой. Принтер как печатал, так и печатает.


simpson   (2004-09-28 18:02:00) [8]

> AP3AMAC   (28.09.04 16:58) [2]
> Посылает любое приложение(Word,Excel,Internet Explorer)

Да ну нафиг.
Работай с уведомлениями от спулера через FindFirstPrinterChangeNotification
FindNextPrinterChangeNotification
FindClosePrinterChangeNotification


AP3AMAC   (2004-09-28 16:58:00) [9]

Посылает любое приложение(Word,Excel,Internet Explorer).
Нужно, чтобы пользователь имел возможность печатать только после ввода пароля.


MBo   (2004-09-28 16:24:00) [10]

А кто посылает форме это сообщение?


Наверх

Титульная страница Поиск, карта сайта Написать письмо