Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.3(hooks).doc
Скачиваний:
81
Добавлен:
18.05.2015
Размер:
155.65 Кб
Скачать

Функция 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

только глобально

Для определённых типов ловушек, локальная имеет приоритет и вызывается первой нежели глобальная.

Соседние файлы в папке ОСиСП - методички