Программирование arrow Win API arrow Win32 API. Hooks (хуки)

Win32 API. Hooks (хуки)

Оглавление

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

О Hook-точках

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

Цепочки hook-точек

Windows содержит много различных типов hook-точек; каждый тип предоставляет доступ к различным видам Windows - механизма обработки сообщений. Например, прикладная программа может использовать hook-точку WH_MOUSE, чтобы отслеживать в потоке обмена сообщениями сообщения для мыши.

Windows поддерживает отдельную цепочку hook-точек для каждого типа hook-точки. Цепочка hook-точек (hook chain) - список указателей на специальные, определяемые программой функции повторного вызова называемые подключаемыми процедурами (hook procedure). Когда попадается сообщение, который связано со специфическим типом hook-точки, Windows передает это сообщение в каждую подключаемую процедуру, вызываемую одну за другой в цепочке hook-точек. Действие, которое может выбрать подключаемая процедура, зависит от типа включенной hook-точки. Подключаемые процедуры для некоторых типов hook-точек могут только отслеживать сообщения; другие могут изменять сообщения или останавливать их продвижение по цепочке, не давая достигать им следующей подключаемой процедуры или окна назначения. 

Подключаемые процедуры (Hook procedures)

Чтобы воспользоваться преимуществом специфического типа hook-точки, разработчик предоставляет подключаемую процедуру и использует функцию SetWindowsHookEx, чтобы установить ее в цепочку, связанную с hook-точкой. Подключаемая процедура должна иметь следующий синтаксис:

Синтаксис

LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
)

HookProc - метка - заместитель для определяемого программой названия процедуры.

Параметр nCode - код hook-точки, который подключаемая процедура использует, чтобы определить действие на исполнение. Значение кода hook-точки зависит от ее типа; каждый тип имеет свой собственный характерный набор кодов hook-точки. Значения параметров wParam и lParam зависят от кода hook-точки, но они обычно содержат информацию о сообщении, которое было отправлено или передано.

Функция SetWindowsHookEx всегда устанавливает подключаемую процедуру в начале цепочки hook-точек. Когда происходит событие, которое контролируется нестандартным типом hook-точки, Windows вызывает процедуру в начале цепочки hook-точек, связанную с hook-точкой. Каждая фильтр - процедура в цепочке решает, передать ли событие в следующую процедуру. Подключаемая процедура передает событие в следующую процедуру, путем вызова функции CallNextHookEx.

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

Подключаемая процедура может быть глобальной, контролируя сообщения для всех потоков в системе, или она может быть для конкретного потока, контролируя сообщения только для отдельного потока. Глобальная фильтр - процедура может быть вызвана применительно к любой прикладной программе, так что процедура должна быть в отдельном модуле динамически подключаемой библиотеки (DLL). Конкретный поток вызывает подключаемую процедуру только применительно к связанному потоку. Если прикладная программа устанавливает фильтр - процедуру для одного из своих собственных потоков, подключаемая процедура может быть или в том же самом модуле, как остальная часть кода приложения, или в динамически подключаемой библиотеке (DLL). Если прикладная программа устанавливает фильтр - процедуру для потока другой прикладной программы, процедура должна быть в динамически подключаемой библиотеке (DLL). За большей информацией обратитесь к статье. Библиотеки Динамической связи.

Примечание: Глобальные hook-точки Вы должны использовать только для целей отладки программы; но так или иначе, Вы должны избегать их. Глобальные hook-точки наносят ущерб поведению системы и являются причиной конфликтов с другими прикладными программами, которые используют тот же самый тип глобальной hook-точки.

 


 
« Предыдущая статья   Следующая статья »


  • Win32, Win32 API. Быстрые клавиши
    В Microsoft Windows, ускоритель клавиатуры (keyboard accelerator) (или, просто, акселератор) - это нажатие клавиши или комбинация нажатий клавиш, которые генерирует для прикладной программы сообщение WM_COMMAND или WM_SYSCOMMAND....
  • Win32, Win32 API. Пиктограммы
    Пиктограмма (icon) – это рисунок, который состоит из растрового изображения, объединенного с маской, которая создает прозрачные области на рисунке. Этот краткий обзор описывает создание, показ на экране, разрушение и дублирование пиктограмм. Windows использует пиктограммы повсюду в интерфейсе пользователя, чтобы представить объекты, такие как файлы, папки, ярлыки, прикладные программы и документы. Функции пиктограммы в Microsoft Win32...
  • Win32, Win32 API. Структуры и сообщения окна
    Нижеперечисленные структуры и сообщения используются для создания и управления окнами. ...
  • Win32, Win32 API. Функции окна
    Следующие функции используются для создания и управления окнами. ...
  • Win32, Win32 API. Окна
    Окно в прикладной программе, по описанию в операционной системе Microsoft Windows - прямоугольная область экрана, где прикладная программа отображает выводимую и принимает вводимую информацию от пользователя. Окно разделяет использование экрана с другими окнами, включая и те, которые созданы из других прикладных программ. В один и тот же момент времени только одно окно может принимать вводимые данные от пользователя. Пользователь может использовать мышь, клавиатуру или друг...
  • Win32, Win32 API. Меню
    Меню (menu) состоит из перечня пунктов меню (menu items). Выбор пункта меню открывает подменю или принуждает прикладную программу выполнить команду. Этот краткий обзор описывает меню и объясняет, как использовать их в прикладных программах, разработанных при помощи Microsoft Win32 прикладного программного интерфейса (API)....
  • Win32, Win32 API. Курсоры
    Windows предоставляет набор стандартных курсоров, которые являются доступными для любой прикладной программы, чтобы использовать в любое время. Заголовочные файлы Windows содержат идентификаторы для стандартных курсоров - идентификаторы начинаются с префикса "IDC_". Каждый стандартный курсор имеет соответствующее заданное по умолчанию изображение, связанное с ним. Пользователь или прикладная программа могут заменять заданное по умолча...
  • Win32, Win32 API. Функции и сообщения ввода информации с клавиатуры
    Следующие функции используются, чтобы принимать и обрабатывать ввод информации с клавиатуры....