Прочитать на английском

Поделиться через


WinEvents и Active Accessibility

Серверы Microsoft Active Accessibility вызывают WinEvents, чтобы уведомить клиентов об изменениях доступного объекта. Существует множество условий, в которых сервер уведомляет клиента об изменении. Каждое константное событие , определенное microsoft Active Accessibility, описывает условие, о котором уведомляется клиент. Например, WinEvents может сигнализировать:

  • При создании или уничтожении объекта.
  • Когда объект получает или теряет фокус.
  • При изменении состояния или расположения объекта.
  • При изменении любого свойства объекта.

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

Функции перехватчика находятся в теле кода клиента, в библиотеке DLL, сопоставленной с процессом клиента, или в библиотеке DLL, сопоставленной с процессом сервера. Каждый из этих методов имеет преимущества и недостатки. Дополнительные сведения см. в разделе In-Context и функции перехватчика вне контекста.

Чтобы уведомить клиентов о возникновении события, серверы вызывают NotifyWinEvent. Система проверяет, установили ли клиентские приложения функции перехватчика для события, и при необходимости вызывает соответствующие функции перехватчика.

При вызове функции перехватчика клиента он получает ряд параметров, описывающих событие и объект, создающий событие. Чтобы получить доступ к объекту, который создал событие, функция перехватчика клиента вызывает AccessibleObjectFromEvent.

Примечание

Если ни один клиент не зарегистрировался для получения WinEvents, влияние на производительность сервера при вызове NotifyWinEvent незначительно.

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

обмен данными Event-Driven

Клиенты должны зарегистрировать «перехватчик событий» WinEvent перед тем, как они смогут получать уведомления WinEvent. Чтобы избежать ненужных обратных вызовов и повысить производительность, клиентам рекомендуется зарегистрировать только события, которые они должны получать.

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

WinEvents