Процедуры фильтров (hook)
Чтобы использовать в своих интересах конкретный тип фильтра (hook) событий, разработчик предоставляет процедуру фильтра (hook) и использует функцию SetWindowsHookEx, которая устанавливает ее в цепочку, связанную с фильтром (hook) событий. Процедура фильтра (hook) должна иметь нижеследующий синтаксис:
LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam ); |
HookProc является именем - заместителем для определяемого программой имени.
Параметр nCode - это код фильтра (hook), который процедура фильтра (hook) использует, чтобы выяснить действие, которое осуществляется. Значение кода фильтра (hook) событий зависит от его типа; каждый тип имеет свой собственный характерный набор кодов фильтров. Значения параметров wParam и lParam зависят от кода фильтра (hook), но они обычно содержат информацию о сообщении, которое было отправлено или передано.
Функция SetWindowsHookEx всегда устанавливает процедуру фильтра (hook) в начале цепочки фильтров (hook). Когда происходит событие, текущий контроль над которым осуществляется конкретным типом фильтра (hook), система вызывает процедуру в начале цепочки фильтра, связанную с этим фильтром (hook) событий. Каждая процедура фильтра (hook) событий в цепочке выясняет, переправлять ли событие в следующую процедуру. Процедура фильтра (hook) - переправляет событие в следующую процедуру при помощи вызова функции CallNextHookEx.
Обратите внимание! на то, что процедуры фильтров (hook) событий для некоторых типов фильтров могут осуществлять только текущий контроль за сообщением. Система передает сообщения в каждую процедуру фильтра (hook) событий, независимо от того, вызывает ли данная процедура функцию CallNextHookEx. |
Общий фильтр ( global hook) событий осуществляет текущий контроль за сообщениями всех потоков на одном и том же рабочем столе, что и вызывающий поток. Специальный для потока фильтр (hook) событий осуществляет текущий контроль за сообщениями только этого отдельного потока. Общая процедура фильтра (hook) может вызываться в контексте любого приложения на одном и том же рабочем столе, что и вызывающий поток, так что процедура должна находиться в отдельном модуле динамически подключаемой библиотеки (DLL). Специальная для потока процедура фильтра (hook) вызывается только в контексте связанного с ней потока. Если приложение устанавливает процедуру фильтра (hook) событий для одного из своих собственных потоков, процедура фильтра (hook) событий может находиться, либо в каком-то модуле, как резервная часть кода приложения, или в DLL. Если приложение устанавливает процедуру фильтра (hook) для потока другой программы, процедура должна находиться в DLL. Информацию, см. в статье Динамически подключаемые библиотеки (DLL).
Обратите внимание! на то, что Вы должны использовать глобальный фильтр (hook) только для целей отладки; в противном случае, вам следует избегать их. Глобальные фильтры (hook) снижают эффективность системы и становятся причиной конфликтов с другими программами, которые реализуют тот же самый тип глобального фильтра (hook) сообщений. |