Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

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

 
AP3AMAC   (2004-09-28 16:15) [0]

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

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;

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


 
MBo ©   (2004-09-28 16:24) [1]

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


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

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


 
simpson ©   (2004-09-28 18:02) [3]

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

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


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

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


 
simpson ©   (2004-09-29 18:54) [5]

> Мне нужно перехватить попытку печати именно на 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, поймав уведомление о создании очередного файла запрашивать инфу о всех заданиях, ну а дальше - приостанавливать задание, запрашивать пароль, и, если он не введен или введен неправильно, убивать задание.


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

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


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


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

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


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

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


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

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


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


> 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-30 20:09) [10]

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

// наша 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 и не заморачиваться. Но ты попробуй оба варианта.



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
14-1098149318
able
2004-10-19 05:28
2004.11.07
avi2scr


3-1096868940
Галинка
2004-10-04 09:49
2004.11.07
Как создать таблицу ADO+Access...


1-1098700751
Strimer
2004-10-25 14:39
2004.11.07
Использование Project2 в Project1


14-1098200193
ZDima
2004-10-19 19:36
2004.11.07
Нахождение корня уравнения вида f(x)=0 методом интераций


14-1097961761
Soft
2004-10-17 01:22
2004.11.07
Марихуану курить нужно тоже в меру...