Фильтры (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.