Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.038 c
14-1097843522
dreamse
2004-10-15 16:32
2004.11.07
Open Source софт для клубов


14-1097666622
}|{yk
2004-10-13 15:23
2004.11.07
Какие художественные книги вы прочитали за этот год?


14-1097815067
MBo
2004-10-15 08:37
2004.11.07
Пятница - время поломать голову над непростыми задачками.


3-1097053508
Belkova
2004-10-06 13:05
2004.11.07
запрос


14-1097728339
Dmitriy O.
2004-10-14 08:32
2004.11.07
Разработка ПО сторонними организациями.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский