Функция SetWindowsHookEx.
Функция SetWindowsHookEx устанавливает процедуру
ловушки в цепочку ловушек. Ловушки предназначены
для того, чтобы отслеживать в системе
определённые типы событий. Эти события могут
быть связаны как с определённым потоком, так и со
всеми потоками в системе.
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
Параметры
- idHook
- Тип устанавливаемой ловушки. Этот параметр
может иметь одно из следующих значений:
- WH_CALLWNDPROC
- Ловушка будет перехватывать оконные сообщения
до того, как система отправит их оконной
процедуре, для которой они предназначены. См.
процедуру ловушки CallWndProc.
- WH_CALLWNDPROCRET
- Оконные сообщения будут поступать в ловушку
после того, как они будут обработаны оконной
процедурой. См. процедуру ловушки CallWndRetProc.
- WH_CBT
- Ловушка будет получать уведомления,
используемые в приложениях "computer-based training (CBT)".
См. процедуру ловушки CBTProc.
- WH_DEBUG
- Ловушка будет использоваться для отладки
других ловушек. См. процедуру ловушки DebugProc.
- WH_FOREGROUNDIDLE
- Ловушка будет вызываться, когда фоновый поток
приложения перейдёт в состояние idle. Эта ловушка
используется для настройки задач с низким
приоритетом. См. процедуру ловушки ForegroundIdleProc.
- WH_GETMESSAGE
- Ловушка будет перехватывать сообщения,
посылаемые в очередь сообщений. См. процедуру
ловушки GetMsgProc.
- WH_JOURNALPLAYBACK
- Ловушка будет помещать сообщения,
предварительно записанные процедурой WH_JOURNALRECORD.
См. процедуру ловушки JournalPlaybackProc.
- WH_JOURNALRECORD
- Ловушка будет записывать входные сообщения,
помещаемые в системную очередь сообщений. Обычно
данная ловушка используется для записи макросов.
См. процедуру ловушки JournalRecordProc.
- WH_KEYBOARD
- Ловушка будет перехватывать все сообщения с
клавиатуры. См. процедуру ловушки KeyboardProc.
- WH_KEYBOARD_LL
- Windows NT/2000/XP: Ловушка будет перехватывать
низкоуровневые события ввода с клавиатуры. См.
процедуру ловушки LowLevelKeyboardProc.
- WH_MOUSE
- Ловушка будет перехватывать все сообщения с
мышки. См. процедуру ловушки MouseProc.
- WH_MOUSE_LL
- Windows NT/2000/XP: Ловушка будет перехватывать
низкоуровневые события с мышки. См. процедуру
ловушки LowLevelMouseProc.
- WH_MSGFILTER
- Ловушка будет перехватывать сообщения при
работе с диалоговыми окнами, окнами сообщений,
менюшками и скроллбарами. См. процедуру ловушки MessageProc.
- WH_SHELL
- Ловушка будет получать уведомления,
используемые приложениями оболочки. См.
процедуру ловушки ShellProc.
- WH_SYSMSGFILTER
- Ловушка будет перехватывать сообщения при
работе с диалоговыми окнами, окнами сообщений,
менюшками и скроллбарами. Отличие её от WH_MSGFILTER заключается в том, что она
может устанавливаться только глобально и будет
получать сообщения от всех потоков в системе. См.
процедуру ловушки SysMsgProc.
- lpfn
- Указатель на функцию ловушки. Если параметр dwThreadId
равен нулю или содержит идентификатор потока,
созданного в другом процессе, то параметр lpfn
должен указывать на процедуру ловушки в
динамически закгружаемой библиотеке (DLL). Либо lpfn
может указывать на функцию ловушки в текущем
процессе.
- hMod
- Дескриптор DLL, содержащей функцию, указанную в
параметре lpfn. Если параметр dwThreadId
указывает на поток, созданный текущим процессом
или если функция ловушки находится в текущем
процессе, то параметр hMod должен равняться NULL.
- dwThreadId
- Идентификатор потока, в котором необходимо
перехватывать сообщения. Если этот параметр
равен нулю, то ловушка будет перехватывать
сообщения из всех запущенных потоков в системе.
Возвращаемое значение
В случае успеха, функция вернёт значение
дескриптора процедуры ловушки.
В случае ошибки, функция вернёт NULL. Для
получения более подробной информации об ошибке,
можно воспользоваться функцией GetLastError.
Замечания
Если параметр hMod сделать равным NULL, и
параметр dwThreadId так же равен нулю или
указывает на поток, созданный другим процессом,
то может возникнуть ошибка.
Вызывать функцию CallNextHookEx,
чтобы передать управление следующей ловушке не
обязательно, но очень рекомендуется, иначе
другие приложения, которые установили ловушки не
смогут получать уведомления и, как следствие, и
правильно работать.
Перед завершением, приложение должно вызвать
функцию UnhookWindowsHookEx, чтобы
освободить ресурсы, занятые ловушкой.
Область действия ловушки зависит от типа
ловушки. Некоторые ловушки могут
устанавливаться только на всю систему (глобально),
в то время как другие могут устанавливаться
только на определённый поток (локально), как
указано в таблице:
Ловушка |
Область действия |
WH_CALLWNDPROC |
локально или глобально |
WH_CALLWNDPROCRET |
локально или глобально |
WH_CBT |
локально или глобально |
WH_DEBUG |
локально или глобально |
WH_FOREGROUNDIDLE |
локально или глобально |
WH_GETMESSAGE |
локально или глобально |
WH_JOURNALPLAYBACK |
только глобально |
WH_JOURNALRECORD |
только глобально |
WH_KEYBOARD |
локально или глобально |
WH_KEYBOARD_LL |
только глобально |
WH_MOUSE |
локально или глобально |
WH_MOUSE_LL |
только глобально |
WH_MSGFILTER |
локально или глобально |
WH_SHELL |
локально или глобально |
WH_SYSMSGFILTER |
только глобально |
Для определённых типов ловушек, локальная
имеет приоритет и вызывается первой нежели
глобальная.
Пример
См. Использование Ловушек.
Дополнительная информация
Заголовок |
Объявлена в Winuser.h, включена в Windows.h |
Библиотека |
User32.lib |
Минимальные ОС |
Присутствует начиная с Windows 95, Windows
NT 3.1 |
Unicode |
В Windows NT, Windows 2000, Windows XP присутствует как
Unicode, так и ANSI версии этой функции |
|