Для установки и доступа к фильтрующим функциям приложения используют функции SetWindowsHookExи UnhookWindowsHookEx.
Хуки предоставляют мощные возможности для приложений Windows. Приложения могут использовать хуки в следующих целях:
• Обрабатывать или изменять все сообщения, предназначенные для всех диалоговых окон (dialog box), информационных окон (message box), полос прокрутки (scroll bar), или меню одного приложения (WH_MSGFILTER).
• Обрабатывать или изменять все сообщения, предназначенные для всех диалоговых окон, информационных окон, полос прокрутки, или меню всей системы (WH_SYSMSGFILTER).
• Обрабатывать или изменять все сообщения в системе (все виды сообщений), получаемые функциями GetMessageили PeekMessage(WH_GETMESSAGE).
• Обрабатывать или изменять все сообщения (любого типа), посылаемые вызовом функции SendMessage(WH_CALLWNDPROC).
• Записывать или проигрывать клавиатурные и мышиные события (WH_JOURNALRECORD, WH_JOURNALPLAYBACK).
• Обрабатывать, изменять или удалять клавиатурные события (WH_KEYBOARD).
• Обрабатывать, изменять или отменять события мыши (WH_MOUSE).
• Реагировать на определенные действия системы, делая возможным разработку приложений компьютерного обучения – computer-based training (WH_CBT).
• Предотвратить вызов другой функции-фильтра (WH_DEBUG).
Приложения уже используют хуки для следующих целей:
• Добавить поддержку кнопки F1 для меню, диалоговых и информационных окон (WH_MSGFILTER).
• Обеспечить запись и воспроизведение событий мыши и клавиатуры, часто называемых макросами. Например, программа Windows Recorder использует хуки для записи и воспроизведения (WH_JOURNALRECORD, WH_JOURNALPLAYBACK).
• Следить за сообщениями, чтобы определить, какие сообщения предназначены определенному окну или какие действия генерирует сообщение (WH_GETMESSAGE, WH_CALLWNDPROC). Утилита Spy из Win32T Software Development Kit (SDK) for Windows NTT использует для этих целей хуки. Исходные тексты Spy можно найти в SDK.
• Симулировать мышиный и клавиатурный ввод (WH_JOURNALPLAYBACK). Хуки – единственный надежный способ симуляции этих действий. Если попытаться имитировать их через посылку сообщений, не будет происходить обновление состояния клавиатуры или мыши во внутренних структурах Windows, что может привести к непредсказуемому поведению. Если для воспроизведения клавиатурных или мышиных событий используются хуки, эти события обрабатываются в точности так, как и настоящий ввод с клавиатуры или мыши. Microsoft Excel использует хуки для реализации макрофункции SEND.KEYS.
• Сделать возможным использование CBT приложениями Windows (WH_CBT). Хук WH_CBT значительно облегчает разработку CBT-приложений.
Как пользоваться хуками
Чтобы пользоваться хуками, вам необходимо знать следующее:
• Как использовать функции Windows для добавления и удаления фильтрующих функций из очереди функций хука.
• Какие действия должна будет выполнить фильтрующая функция, которую вы устанавливаете.
• Какие существуют виды хуков, что они могут делать, и какую информацию (параметры) они передают вашей функции.
Функции Windows для работы с хуками
Приложения Windows используют функции SetWindowsHookEx, UnhookWindowsHookEx, и CallNextHookExдля управления очередью функций-фильтров хука. До версии 3.1 Windows предоставляла для управления хуками функции SetWindowsHook, UnhookWindowsHook, и DefHookProc. Хотя эти функции до сих пор реализованы в Win32, у них меньше возможностей, чем у их новых ( Ex) версий. Всегда старайтесь использовать только эти новые функции в своих проектах.
SetWindowsHookExи UnhookWindowsHookExописаны ниже. Обратитесь к разделу "Вызов следующей функции в очереди фильтрующих функций" за информацией по CallNextHookEx.
SetWindowsHookEx
Функция SetWindowsHookExдобавляет функцию-фильтр к хуку. Эта функция принимает четыре аргумента:
Целочисленный код, описывающий хук, к которому будет прикреплена фильтрующая функция. Эти коды определены в WINUSER.H и будут описаны позднее.
Адрес функции-фильтра. Эта функция должна быть описана как экспортируемая включением ее в секцию EXPORTSфайла определения приложения или библиотеки динамической линковки (DLL), или использованием соответствующих опций компилятора.
Хэндл модуля, содержащего фильтрующую функцию. В Win32 (в отличие от Win16), этот параметр должен быть NULL при установке хука на поток (см. ниже), но данное требование не является строго обязательным, как указано в документации. При установке хука для всей системы или для потока в другом процессе, нужно использовать хэндл DLL, содержащей функцию-фильтр.
Читать дальше