Win32 API. Hooks (хуки) - Типы hook-точек

ОГЛАВЛЕНИЕ

Типы hook-точек

Каждый тип hook-точки дает возможность прикладной программе контролировать различные аспекты механизма обработки сообщений Windows. Следующие разделы описывают типы hook-точек, доступных в Windows.

 

Hook-точки WH_CALLWNDPROC и WH_CALLWNDPROCRET

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

Hook-точка WH_CALLWNDPROCRET передает адрес структуры CWPRETSTRUCT в подключаемую процедуру. Структура содержит возвращаемое значение из оконной процедуры, которая обработала сообщение, а также параметры сообщения, связанные с ним. Деление на подклассы окон не работает для сообщений, установленных между процессами.

Для получения дополнительной информации, см. функции CallWndProc и CallWndRetProc.

 

Hook-точка WH_CBT

Windows вызывает подключаемую процедуру WH_CBT перед активизацией, созданием, разрушением, уменьшением, максимизированием, перемещением, или установкой размеров окна; перед завершением системной команды; перед удалением события мыши или клавиатуры из системной очереди сообщений; перед установкой фокуса ввода; или перед синхронизацией системной очереди сообщений. Значение, возвращаемое подключаемой процедурой, определяет, позволяет ли Windows или не допускает одно из этих действий. Hook-точка WH_CBT предназначена прежде всего для основной компьютерной подготовки (CBT) прикладной программы.

Для получения дополнительной информации, см. функцию CBTProc.

 

Hook-точка WH_DEBUG

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

Для получения дополнительной информации, см. функцию DebugProc.

 

Hook-точка WH_FOREGROUNDIDLE

Hook-точка WH_FOREGROUNDIDLE позволяет вам выполнять низкоприоритетные задачи в тот период, когда приоритетный поток не используется.

Windows вызывает подключаемую процедуру WH_FOREGROUNDIDLE тогда, когда приоритетный поток прикладной программы собирается стать неактивным.

За большей информацией обратитесь к статье Функция ForegroundIdleProc.

 

Hook-точка WH_GETMESSAGE

Hook-точка WH_GETMESSAGE дает возможность прикладной программе контролировать сообщения, которые функция GetMessage или PeekMessage намереваются возвратить. Вы можете использовать hook-точку WH_GETMESSAGE, чтобы контролировать вводимые данные от мыши и клавиатуры и другие сообщения, зарегистрированные в очереди сообщений.

Для получения дополнительной информации, см. статью Функция GetMsgProc.

 

Hook-точка WH_JOURNALPLAYBACK

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

Hook-точка WH_JOURNALPLAYBACK возвращает значение блокировки времени. Это значение сообщает системе, сколько миллисекунд необходимо ждать перед обработкой текущего сообщения от hook-точки воспроизведения. Это дает возможность hook-точке управлять величиной времени воспроизводимых событий.

Для получения дополнительной информации, см. статью Функция JournalPlaybackProc.

 

Hook-точка WH_JOURNALRECORD

Hook-точка WH_JOURNALRECORD дает Вам возможность контролировать и занести в список входящие события. Как правило, Вы используете эту hook-точку, чтобы записать в список последовательности событий от мыши и клавиатуры, чтобы воспроизвести их позже, используя hook-точку WH_JOURNALPLAYBACK. Hook-точка WH_JOURNALRECORD - глобальная hook-точка, это означает, что она не может быть использована как hook-точка, определяемая потоком.

Для получения дополнительной информации, см. статью Функция JournalRecordProc.

 

Hook-точка WH_KEYBOARD

Hook-точка WH_KEYBOARD дает возможность прикладной программе контролировать поток сообщений для сообщений WM_KEYDOWN и WM_KEYUP, которые функция GetMessage или PeekMessage намеревается возвратить. Вы можете использовать hook-точку WH_KEYBOARD, чтобы контролировать ввод с клавиатуры, переданный в очередь сообщений.

Для получения дополнительной информации, см. статью о функции KeyboardProc.

 

Hook-точка WH_MOUSE

Hook-точка WH_MOUSE дает возможность Вам контролировать сообщения мыши, которые функция GetMessage или PeekMessage намеревается возвратить. Вы можете использовать hook-точку WH_MOUSE, чтобы контролировать ввод мыши, переданный в очередь сообщений.

Для получения дополнительной информации, см. статью о функции MouseProc.

 

Hook-точки WH_MSGFILTER и WH_SYSMSGFILTER

Hook-точки WH_MSGFILTER и WH_SYSMSGFILTER дают возможность Вам контролировать сообщения, которые будут обработаны меню, линейкой прокрутки, окном сообщений или диалоговым окном, и обнаруживать, когда другое окно собирается стать активным в результате нажима пользователем комбинации клавиш ALT+TAB или ALT+ESC. Hook-точка WH_MSGFILTER может контролировать только сообщения переданные в меню, линейку прокрутки, окну сообщений или блоку диалога, созданному прикладной программой, которая установила подключаемую процедуру. Hook-точка WH_SYSMSGFILTER контролирует такие сообщения для всех прикладных программ.

Hook-точки WH_MSGFILTER и WH_SYSMSGFILTER дают возможность Вам выполнить фильтрацию сообщений в ходе модальных циклов, которые является эквивалентными фильтрации производимой в основном цикле сообщений. Например, прикладная программа часто проверяет новое сообщение в основном цикле между временем поиска своего сообщения в очереди и временем, когда она посылает сообщение, выполнив специальную обработку, как это требуется. Однако в ходе модального цикла, система извлекает и распределяет сообщения без предоставления прикладной программе возможности фильтровать сообщения в ее главном цикле сообщений. Если прикладная программа устанавливает подключаемую процедуру WH_MSGFILTER или WH_SYSMSGFILTER, система вызывает процедуру в ходе модального цикла.

Прикладная программа может вызывать hook-точку WH_MSGFILTER непосредственно, вызывая функцию CallMsgFilter. Используя эту функцию, прикладная программа может использовать тот же самый код, чтобы фильтровать сообщения в ходе модальных циклов, поскольку он используется в основном цикле сообщений. Поступив так, вы инкапсулируйте операции фильтрации в подключаемой процедуре WH_MSGFILTER и вызываете CallMsgFilter между обращениями к функциям GetMessage и DispatchMessage.

while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
if (!CallMsgFilter(&qmsg, 0))
DispatchMessage(&qmsg);
}

Последний параметр CallMsgFilter просто передают в подключаемую процедуру; Вы можете ввести любое значение. Подключаемая процедура, определив константу типа MSGF_MAINLOOP, может использовать это значение, чтобы определить, кем процедура была вызвана.

Для получения дополнительной информации, см. статью о функции MessageProc и SysMsgProc.

 

Hook-точки WH_SHELL

Оболочка прикладной программы может использовать hook-точку WH_SHELL, чтобы принять важные предупреждения. Windows вызывает подключаемую процедуру WH_SHELL тогда, когда оболочка прикладной программы собирается быть активной и когда окно верхнего уровня создается или разрушается.

Для получения дополнительной информации, см. статью о функции ShellProc