Win32 API. Hooks (хуки) - Функция SetWindowsHookEx
ОГЛАВЛЕНИЕ
Функция SetWindowsHookEx
(УстановкаНоокОкнаРасширенная)
Функция SetWindowsHookEx устанавливает определяемую программой подключаемую процедуру в цепочку hook-точек. Прикладная программа устанавливает фильтр - процедуру, чтобы контролировать некоторые типы событий в системе. Подключаемая процедура может контролировать события связанные или с конкретным потоком или со всеми потоками в системе. Эта функция заменяет функцию SetWindowsHook.
Синтаксис
HHOOK SetWindowsHookEx
(
int idHook, // тип hook-точки, которая устанавливается
HOOKPROC lpfn, // адрес подключаемой процедуры
HINSTANCE hMod, // дескриптор экземпляра прикладной программы
DWORD dwThreadId // идентификация потока, который устанавливает hook-точку
);
Параметры
idHook
Определяет тип подключаемой процедуры, которая будет установлена. Этот параметр может быть одним из следующих значений:
- WH_CALLWNDPROC - Устанавливает подключаемую процедуру, которая контролирует сообщения до того, как система отправит их оконной процедуре предназначения. Для получения дополнительной информации, см. подключаемую процедуру CallWndProc.
- WH_CALLWNDPROCRET - Устанавливает подключаемую процедуру, которая контролирует сообщения после того, как они были обработаны оконной процедурой предназначения. Для получения дополнительной информации, см. подключаемую процедуру CallWndRetProc.
- WH_CBT - Устанавливает подключаемую процедуру, которая принимает уведомления, полезные для машинной подготовки (CBT) прикладной программы. Для получения дополнительной информации, см. подключаемую процедуру CBTProc.
- WH_DEBUG - Устанавливает подключаемую процедуру, полезную для отладки других фильтр - процедур. Для получения дополнительной информации, см. подключаемую процедуру DebugProc.
- WH_GETMESSAGE - Устанавливает подключаемую процедуру, которая контролирует сообщения, задержанные в очереди сообщений. Для получения дополнительной информации, см. подключаемую процедуру GetMsgProc.
- WH_JOURNALPLAYBACK - Устанавливает подключаемую процедуру, которая задерживает сообщения, предварительно записанные подключаемой процедурой WH_JOURNALRECORD. Для получения дополнительной информации, см. подключаемую процедуру JournalPlaybackProc.
- WH_JOURNALRECORD - Устанавливает подключаемую процедуру, которая записывает входящие сообщения, задерживаемые в системной очереди сообщений. Эта hook-точка полезна для регистрации макрокоманд. Для получения дополнительной информации, см. подключаемую процедуру JournalRecordProc.
- WH_KEYBOARD - Устанавливает подключаемую процедуру, которая контролирует сообщения нажатия клавиш. Для получения дополнительной информации, см. подключаемую процедуру KeyboardProc.
- WH_MOUSE - Устанавливает подключаемую процедуру, которая контролирует сообщения мыши. Для получения дополнительной информации, см. подключаемую процедуру MouseProc.
- WH_MSGFILTER - Устанавливает подключаемую процедуру, которая контролирует сообщения, созданные в результате события ввода в диалоговом окне, окне сообщений, меню или линейке прокрутки. Для получения дополнительной информации, см. подключаемую процедуру MessageProc.
- WH_SHELL - Устанавливает подключаемую процедуру, которая принимает уведомления, полезные для оболочки прикладных программ. Для получения дополнительной информации, см. подключаемую процедуру ShellProc.
- WH_SYSMSGFILTER - Устанавливает подключаемую процедуру, которая контролирует сообщения, созданные в результате события ввода диалоговом окне, окне сообщений, меню или линейке прокрутки. Фильтр - процедура контролирует эти сообщения для всех прикладных программ в системе. Для получения дополнительной информации, см. подключаемую процедуру SysMsgProc.
lpfn
Указывает на подключаемую процедуру. Если параметр dwThreadId нулевой или он определяет идентификатор потока, созданного другим процессом, параметр lpfn должен указывать на фильтр - процедуру в динамически компонуемой библиотеке (DLL). Иначе, lpfn может указывать на подключаемую процедуру в коде, связанном с текущим процессом.
hMod
Идентифицирует динамически подключаемую библиотеку (DLL), содержащую фильтр - процедуру, указанную lpfn параметром. Параметр hMod должен быть установлен в значение ПУСТО (NULL), если параметр dwThreadId определяет поток, созданный текущим процессом и, если подключаемая процедура внутри кода, связанного с текущим процессом.
dwThreadId
Определяет идентификатор потока, с которым подключаемая процедура должна быть связана. Если этот параметр нулевой, фильтр - процедура связана со всеми существующими потоками.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - дескриптор подключаемой процедуры.
Если функция не выполняет задачу, величина возвращаемого значения ПУСТО (NULL).
Замечания
Если параметр hMod значение ПУСТО (NULL), а параметр dwThreadId нулевой или определяет идентификатор потока, созданного другим процессом, может произойти ошибка.
Формирование цепочки со следующей подключаемой процедурой (то есть вызов функции CallNextHookEx) необязателен. Прикладная программа или библиотека могут вызывать следующую фильтр - процедуру или до или после любой обработки в своей собственной подключаемой процедуре. Хотя сцепление со следующей hook-точкой необязательно, это настоятельно рекомендуется; иначе, другие прикладные программы, которые установили hook-точки, не будут принимать уведомления hook-точки и, в результате, могут повести себя неправильно.
Перед завершением, прикладная программа должна вызвать функцию UnhookWindowsHookEx, чтобы освободить системные ресурсы, связанные с hook-точкой.
Область действия hook-точки зависит от типа hook-точки. Некоторые hook-точки могут быть установлены только с системными возможностями; другие могут также быть установлены только для конкретного потока, как показано в следующем списке:
- WH_CALLWNDPROC - Поток или система
- WH_CBT - Поток или система
- WH_DEBUG - Поток или система
- WH_GETMESSAGE - Поток или система
- WH_JOURNALPLAYBACK - Система только
- WH_JOURNALRECORD - Система только
- WH_KEYBOARD - Поток или система
- WH_MOUSE - Поток или система
- WH_MSGFILTER - Поток или система
- WH_SHELL - Поток или система
- WH_SYSMSGFILTER - Система только
Для заданного типа hook-точки, сначала вызываются hook-точки потока, затем системные hook-точки.
Системные hook-точки являются общедоступным ресурсом, и установка одной воздействует на все прикладные программы. Все системные функции hook-точки должны быть в библиотеках. Системные hook-точки должны быть для узкого круга прикладных программ специального назначения или использоваться как помощь в разработке прикладной программы в ходе отладки. Библиотеки, которые больше не нуждаются в hook-точке, должны удалить подключаемую процедуру.
Смотри также
CallNextHookEx, CallWndProc, CallWndRetProc, CBTProc, DebugProc, GetMsgProc, JournalPlaybackProc, JournalRecordProc, KeyboardProc, MouseProc, MessageProc, ShellProc, SysMsgProc, UnhookWindowsHookEx
Размещение и совместимость SetWindowsHookEx
Windows NT Да
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode WinNT
Замечания по платформе Не имеется