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 для получения сведений или взаимодействия с элементом пользовательского интерфейса.