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


WinEvents и активные специальные возможности

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

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

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

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

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

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

Примечание

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

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

Связь Event-Driven

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

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

WinEvents