Показать полную графическую версию : Перехват обращения к принтеру
В моей утилите мне необходимо отследить обращение программ к принтеру (следует подсчитать кол-во распечатанных страниц). Решение этой задачи в Linux/Unix очевидно. Для Windows я не созрел. Пытался отследить это событие с помощью WinSight - не получилось.
Может быть кто-нибудь подскажет решение в Windows?
Вопроса собственно два.
1. Что это за событие?
2. Как мне его "потрогать" в моей утилите? Думаю, что можно было бы непрерывно читать события глобальной очереди через PeekMessage(). Но может быть есть более красивое решение - типа перехвата системного вызова (как в Linux/Unix).
Заранее благодарен.
DillerInc
25-03-2006, 14:54
knzsoft
1. Я думаю,это будет сообщение типа WM_PRINT (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_3qwk.asp) .
2. Не уверен,но возможно получится установить хук на это сообщение и далее попробовать получить информацию "что да как" ...
Спасибо за отклик. Попытался разобраться. Думаю, что это скорее WM_PAINT на контексте принтера, но только какой из кучи? :(
Установка hook производится на уровне драйвера или в пользовательском постранстве? Читаю MSDN но пока не найду ответа.
DillerInc
25-03-2006, 21:31
Думаю, что это скорее WM_PAINT
...почему?
WM_PAINT - это,как я понял,в большинстве случаев простой перерисовки окна,а WM_PRINT в основном используется в контексте принтера.
К тому же при перехвате WM_PAINT мы получаем только описатель окна,а в случае с WM_PRINT мы получим дескриптор контекста и какие-то флаги.Правда,я немного не догоняю,как потом по полученному дескриптору контекста вычислить принтер,его использующий??
Хук ставится на пользовательском уровне.С помощью функции SetWindowsHookEx (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp).Но там тоже есть некоторые непонятки в данном случае.
Я не вижу события WM_PRINT при печати из MS WORD в WinSight :(. Зато в избытке вижу WM_PAINT и WM_NCPAINT. Часть их легко расшифровываются и относятся к перерисовкам на экране. А вот некоторые из них могут оказаться событием рисования на hDC принтера.
В ОС Linux ситуация для меня много проще потому, что я хорошо знаю модель взаимодействия приложения с драйвером. В Windows, я, к сожалению, этого не знаю. Может быть не событие искать надо, а, как в случае с Linux/Unix, системный вызов к драйверу печати? Существуют ли такие понятия в Windows?
За SetWindowHookEx отдельное спасибо. Я начинаю понимать, что можно сделать с событиями в Windows :).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.