Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 семестр / Литература / лекция8.прерывания.pptx
Скачиваний:
12
Добавлен:
18.02.2023
Размер:
200.77 Кб
Скачать

ФУНКЦИЯ ЛОВУШКИ

Функция хука может быть глобальной. В этом случае она просматривает сообщения для всех потоков в системе. Можно также определить функцию хука для одного потока, чтобы просматривать сообщения, предназначенные только этому потоку.

Глобальная функция хука может быть вызвана в контексте любого приложения, поэтому она должна быть помещена в отдельный модуль библиотеки DLL.

Функция хука, определенная для одного потока, вызывается только в контексте данного потока. Если приложение устанавливает функцию хука для одного из своих собственных потоков, она может находиться или в том же модуле, что и остальная часть кода приложения, или в DLL.

Если приложение устанавливает функцию хука для потока другого приложения, ее надо поместить в DLL.

ФУНКЦИЯ ЛОВУШКИ

Использовать глобальные хуки следует только в целях отладки, в противном случае лучше избегать их.

Глобальные хуки снижают эффективность системы и вызывают конфликты с другими приложениями, которые используют такой же тип глобального хука.

ХУКИ WH_CALLWNDPROC И WH_CALLWNDPROCRET

позволяют контролировать сообщения, посланные функциям окна приложений функцией SendMessage(). Windows вызывает функцию хука WH_CALLWNDPROC прежде, чем функция окна получит предназначенное ей сообщение. Функция хука WH_CALLWNDPROCRET вызывается после того, как функция окна получит и обработает сообщение.

Прототип функции хука WH_CALLWNDPROC:

LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam);

Параметр wParam - флаг, который определяет, было ли сообщение отправлено текущим процессом.

Параметр lParam - указатель на структуру CWPSTRUCT, которая содержит информацию о сообщении.

ХУК WH_CBT

Windows вызывает функцию хука WH_CBT в следующих случаях:

перед активизацией, созданием, разрушением, сворачиванием, разворачиванием, перемещением или изменением размеров окна;

перед завершением системной команды;

перед удалением события, связанного с мышью или клавиатурой, из системной очереди сообщений;

перед установкой фокуса ввода;

перед синхронизацией посредством системной очереди сообщений.

Значение, которое возвращает функция хука, определяет, будет ли разрешена совершенная операция.

ХУК WH_CBT

Прототип функции хука:

 

LRESULT CALLBACK CBTProc( int nCode,

// код хука

WPARAM wParam,// зависит от кода хука LPARAM lParam // зависит от кода хука);

Если параметр nCode меньше нуля, функция хука просто передает сообщение функции CallNextHookEx() без дальнейшей обработки и возвращает значение, возвращаемое функцией CallNextHookEx().

ПАРАМЕТР NCODE МОЖЕТ ПРИНИМАТЬ СЛЕДУЮЩИЕ ЗНАЧЕНИЯ:

HCBT_ACTIVATE

Система собирается активизировать окно.

HCBT_CLICKSKIPPED

Система удалила сообщение от мыши из системной очереди

 

сообщений.

HCBT_CREATEWND

Система собирается создать окно. Система вызывает функцию

 

хука перед тем, как послать окну сообщение WM_CREATE или

 

WM_NCCREATE. Если функция хука возвращает ненулевое

 

значение, система уничтожает окно; функция CreateWindow()

 

возвращает NULL, но сообщение WM_DESTROY окну не

 

посылается. Если функция хука возвращает 0, окно создается в

 

обычном режиме.

HCBT_DESTROYWND

Система собирается уничтожить окно.

HCBT_KEYSKIPPED

Система удалила сообщение от клавиатуры из системной

 

очереди сообщений.

HCBT_MINMAX

Система собирается свернуть или развернуть окно.

HCBT_MOVESIZE

Система собирается переместить окно или изменить его

 

размер.

HCBT_SETFOCUS

Система собирается передать окну фокус ввода.

HCBT_SYSCOMMAND

Система собирается выполнить системную команду. Перехват

 

этого сообщения позволяет CBT-приложению запретить

 

переключение задач с помощью горячих клавиш.

ХУК WH_DEBUG

Windows вызывает функцию хука WH_DEBUG перед вызовом функции любого другого хука, установленного в системе. Таким образом, этот хук можно использовать для того, чтобы запретить системе вызывать функции других хуков.

Прототип функции хука:

LRESULT CALLBACK DebugProc( int nCode, // код хука WPARAM wParam, LPARAM lParam )

Если параметр nCode равен HC_ACTION, то функция хука должна обработать данное сообщение. Если nCode меньше нуля, то функция хука должна передать сообщение функции CallNextHookEx(), не обрабатывая его, и должна вернуть значение, которое вернет функция CallNextHookEx().

Параметр wParam указывает, какой тип хука собирается вызвать система.

Параметр lParam указывает на структуру DEBUGHOOKINFO, содержащую параметры, которые будут переданы функции вызываемого хука.

ХУК WH_FOREGROUNDIDLE

позволяет выполнять фоновые задачи, когда поток, на который установлен хук, не используется.

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

ХУК WH_GETMESSAGE

Этот хук позволяет приложению контролировать сообщения, которые функция GetMessage() или PeekMessage() собирается извлечь из очереди сообщений.

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

ХУК WH_JOURNALPLAYBACK

позволяет приложению помещать сообщения в системную очередь сообщений. Этот хук можно использовать для того, чтобы проигрывать серию событий от мыши или клавиатуры, которая прежде была записана с помощью хука WH_JOURNALRECORD. Если этот хук установлен, нормальный ввод от мыши и клавиатуры блокируется до тех пор, пока хук не будет снят. Хук WH_JOURNALPLAYBACK может быть только глобальным, т.е. его нельзя установить для отдельного потока.

Хук WH_JOURNALPLAYBACK возвращает время ожидания (time-out value). Это значение сообщает системе, сколько миллисекунд нужно подождать прежде чем обработать данное сообщение из серии событий. Таким образом, хук может контролировать периодичность проигрываемых событий.