订阅UI 自动化事件

Microsoft UI 自动化允许客户端订阅感兴趣的事件。 此功能无需持续轮询系统中的 UI 元素,以查看是否有任何信息、结构或状态发生更改,从而提高了性能。

由于能够只侦听定义范围内的事件,因此效率也得到了提高。 例如,客户端可以侦听列表中的项、列表本身或整个对话框中的选择更改。

注意

不要假定所有可能的事件都由UI 自动化提供程序引发。 例如,并非所有属性更改都会导致Windows 窗体和 Microsoft Win32 控件的标准代理提供程序引发事件。

 

如要了解更多 UI 自动化事件,请参阅 UI 自动化事件概述

注意

在实现事件处理程序之前,应熟悉了解线程问题中所述 的线程问题

 

本主题包含以下各节:

注册事件处理程序

客户端应用程序使用以下 IUIAutomation 方法之一注册事件处理程序来订阅特定类型的事件。

订阅方法 事件类型 回调接口
AddFocusChangedEventHandler 焦点更改 IUIAutomationFocusChangedEventHandler
AddPropertyChangedEventHandlerAddPropertyChangedEventHandlerNativeArray 属性更改 IUIAutomationPropertyChangedEventHandler
AddStructureChangedEventHandler 结构更改 IUIAutomationStructureChangedEventHandler
AddNotificationEventHandler 通知 IUIAutomationNotificationEventHandler
AddAutomationEventHandler 其他事件 IUIAutomationEventHandler

 

当客户端为 (TreeScope_Descendants) 的所有子代添加事件处理程序时,UI 自动化只为子树的根添加一个处理程序,并且处理程序将侦听所有后代。 UI 自动化不以递归方式添加事件处理程序。

当客户端调用 IUIAutomation::RemoveAllEventHandlers 方法时,UI 自动化从客户端进程中删除所有事件处理程序。

若要接收和处理事件,可以实现公开回调接口的事件处理对象,并且必须通过调用事件注册方法(如 IUIAutomation::AddPropertyChangedEventHandler)来注册该对象。 回调接口有一个方法:UI 自动化处理事件时调用此方法。

关闭时,或者当应用程序不再关注UI 自动化事件时,UI 自动化客户端应调用以下一个或多个 IUIAutomation 方法。

注意

UI 自动化客户端不应使用多个线程来添加或删除事件处理程序。 如果在同一客户端进程中添加或删除另一个事件处理程序,则会导致意外行为。

 

方法 说明
RemoveAutomationEventHandler 注销使用 AddAutomationEventHandler 注册的事件处理程序。
RemoveFocusChangedEventHandler 注销使用 AddFocusChangedEventHandler 注册的事件处理程序。
RemovePropertyChangedEventHandler 注销使用 AddPropertyChangedEventHandlerAddPropertyChangedEventHandlerNativeArray 注册的事件处理程序。
RemoveStructureChangedEventHandler 注销使用 AddStructureChangedEventHandler 注册的事件处理程序。
RemoveNotificationEventHandler 注销使用 AddNotificationEventHandler 注册的事件处理程序。
RemoveAllEventHandlers 取消注册所有已注册的事件处理程序。

 

如果事件与取消订阅该事件的请求同时收到,则事件可以在取消订阅处理程序后传递到事件处理程序。 最佳做法是遵循组件对象模型 (COM) 标准,并避免销毁事件处理程序对象,直到其引用计数达到零。 如果事件延迟传递,则取消订阅事件后立即销毁事件处理程序可能会导致访问冲突。

示例

有关演示如何处理UI 自动化事件的代码示例,请参阅如何实现事件处理程序

概念性

UI 自动化事件概述

了解线程问题