Форум: "WinAPI";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизКак поймать событие 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c