15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Функция 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 версии этой функции