Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перехват обращения к принтеру (http://forum.oszone.net/showthread.php?t=63331)

knzsoft 24-03-2006 21:39 421426

Перехват обращения к принтеру
 
В моей утилите мне необходимо отследить обращение программ к принтеру (следует подсчитать кол-во распечатанных страниц). Решение этой задачи в Linux/Unix очевидно. Для Windows я не созрел. Пытался отследить это событие с помощью WinSight - не получилось.

Может быть кто-нибудь подскажет решение в Windows?

Вопроса собственно два.

1. Что это за событие?
2. Как мне его "потрогать" в моей утилите? Думаю, что можно было бы непрерывно читать события глобальной очереди через PeekMessage(). Но может быть есть более красивое решение - типа перехвата системного вызова (как в Linux/Unix).

Заранее благодарен.

DillerInc 25-03-2006 14:54 421568

knzsoft
1. Я думаю,это будет сообщение типа WM_PRINT .
2. Не уверен,но возможно получится установить хук на это сообщение и далее попробовать получить информацию "что да как" ...

knzsoft 25-03-2006 17:37 421590

Спасибо за отклик. Попытался разобраться. Думаю, что это скорее WM_PAINT на контексте принтера, но только какой из кучи? :(
Установка hook производится на уровне драйвера или в пользовательском постранстве? Читаю MSDN но пока не найду ответа.

DillerInc 25-03-2006 21:31 421631

Цитата:

Думаю, что это скорее WM_PAINT
...почему?
WM_PAINT - это,как я понял,в большинстве случаев простой перерисовки окна,а WM_PRINT в основном используется в контексте принтера.
К тому же при перехвате WM_PAINT мы получаем только описатель окна,а в случае с WM_PRINT мы получим дескриптор контекста и какие-то флаги.Правда,я немного не догоняю,как потом по полученному дескриптору контекста вычислить принтер,его использующий??

Хук ставится на пользовательском уровне.С помощью функции SetWindowsHookEx .Но там тоже есть некоторые непонятки в данном случае.

knzsoft 25-03-2006 23:13 421648

Я не вижу события WM_PRINT при печати из MS WORD в WinSight :(. Зато в избытке вижу WM_PAINT и WM_NCPAINT. Часть их легко расшифровываются и относятся к перерисовкам на экране. А вот некоторые из них могут оказаться событием рисования на hDC принтера.

В ОС Linux ситуация для меня много проще потому, что я хорошо знаю модель взаимодействия приложения с драйвером. В Windows, я, к сожалению, этого не знаю. Может быть не событие искать надо, а, как в случае с Linux/Unix, системный вызов к драйверу печати? Существуют ли такие понятия в Windows?

За SetWindowHookEx отдельное спасибо. Я начинаю понимать, что можно сделать с событиями в Windows :).


Время: 09:54.

Время: 09:54.
© OSzone.net 2001-