Фильтры ( hook) WH_MSGFILTER и WH_SYSMSGFILTER


Фильтры (hook) WH_MSGFILTER и WH_SYSMSGFILTER  дают возможность осуществлять текущий контроль за сообщениями, которые обрабатываются  меню, линейкой прокрутки, окном сообщения или диалоговым окном, и обнаруживать, когда другое окно собирается стать активным в результате нажатия пользователем комбинации клавиш ALT+TAB или ALT+ESC. Фильтр (hook) WH_MSGFILTER может только контролировать сообщения, передаваемые в меню, линейку прокрутки, окно сообщения или в диалоговое окно и созданные приложением, которое устанавливало процедуру фильтра. Фильтр (hook) WH_SYSMSGFILTER осуществляет текущий контроль за такими сообщениями для всех приложений.

Фильтры (hook) WH_MSGFILTER и WH_SYSMSGFILTER дают возможность выполнить фильтрацию сообщений в ходе модальных циклов обработки сообщений, которые являются эквивалентом фильтрации, сделанной в главном цикле обработки сообщений.  Например, прикладная программа часто проверяет наличие новых сообщений в главном цикле между временем извлечения сообщения из очереди и временем его распределением, выполняя, по обстановке, специальную обработку. Однако, в ходе модального цикла, система извлекает  и распределенные сообщения, не давая возможности приложению фильтровать сообщения в его главном цикле обработки сообщений. Если прикладная программа устанавливает процедуру фильтра (hook) WH_MSGFILTER или WH_SYSMSGFILTER, система вызывает эту процедуру в ходе модального цикла.

Приложение может вызвать фильтр (hook) WH_MSGFILTER непосредственно при помощи вызова функцией CallMsgFilter. Используя эту функцию,  программа может использовать один и тот же код, чтобы фильтровать сообщения в ходе модальных циклов, поскольку он используется в главном цикле обработки сообщений. Чтобы сделать так, инкапсулируйте операции фильтрации в процедуре фильтра WH_MSGFILTER (hook) и вызовите CallMsgFilter между вызовами функции GetMessage и DispatchMessage.

while (GetMessage(&msg, (HWND) NULL, 0, 0)) 
{ 
    if (!CallMsgFilter(&qmsg, 0)) 
        DispatchMessage(&qmsg); 
} 

Последний параметр CallMsgFilter просто передается в процедуру фильтра (hook); Вы можете ввести любое значение. Процедура фильтра (hook), определяя константу типа MSGF_MAINLOOP, может использовать это значение, чтобы выяснить, откуда процедура вызывалась.

Дополнительную информацию, см. в описании функций MessageProc и SysMsgProc.

Назад в оглавление
На главную страницу

Hosted by uCoz