WinEvents 和主动辅助功能

Microsoft Active Accessibility 服务器会引发 WinEvents ,以便在可访问对象更改时通知客户端。 在很多情况下,服务器会通知客户端更改。 Microsoft Active Accessibility 定义的每个 事件常量 描述通知客户端的条件。 例如,WinEvents 可以发出以下信号:

  • 创建或销毁对象时。
  • 当对象接收或失去焦点时。
  • 当对象的状态或位置发生更改时。
  • 当对象的任何属性更改时。

客户端应用程序不会自动接收事件通知;它们必须通过调用 SetWinEventHook 函数来指定要接收的事件。 使用 SetWinEventHook,客户端注册以接收一个或多个事件,并设置挂钩函数来处理指定的事件。 客户端可以使用同一挂钩函数来处理多种类型的事件,也可以使用多重挂钩函数。 客户端为每个需要注册的挂钩函数调用 SetWinEventHook 一次。

挂钩函数位于客户端的代码正文中、映射到客户端进程的 DLL 中,或映射到服务器进程的 DLL 中。 其中每种方法各有优缺点。 有关详细信息,请参阅 上下文中和上下文外挂钩函数

若要通知客户端发生事件,服务器会调用 NotifyWinEvent。 系统检查是否有任何客户端应用程序为事件设置了挂钩函数,并根据需要调用相应的挂钩函数。

调用客户端的挂钩函数时,它将接收许多参数,这些参数描述事件和生成事件的 对象。 为了获取对生成事件的对象的访问权限,客户端挂钩函数调用 AccessibleObjectFromEvent

注意

如果没有客户端注册接收 WinEvent,则调用 NotifyWinEvent 对服务器的性能影响可以忽略不计。

服务器调用 NotifyWinEvent ,仅针对其自己的可访问对象中的更改;它们不会调用 NotifyWinEvent 来更改系统提供的用户界面元素。

Event-Driven通信

客户端必须先注册 WinEvent 挂钩,然后才能接收 WinEvent 通知。 为了避免不必要的回调并提高性能,建议客户端仅注册需要接收的事件。

在挂钩过程中,客户端可以调用 AccessibleObjectFromEvent 来检索应用事件的元素的 IAccessible 对象。 使用此对象,客户端可以开始调用 IAccessible 方法以检索信息或与 UI 元素交互。

WinEvent