什么是 WinEvents?

服务器应用程序和操作系统使用 WinEvents 在系统或用户界面中发生更改时通知客户端。

WinEvent 支持是 Windows 操作系统的一项功能,可提供:

  • 客户端注册事件通知的简单方法。
  • 用于将客户端代码注入服务器的机制。
  • 将事件从服务器路由到感兴趣的客户端。
  • 为大多数基于 HWND 的控件自动生成事件。

基于 HWND 的控件的事件生成对于服务器开发人员尤其重要。 Microsoft Active Accessibility 运行时为所有标准 UI 元素提供 IAccessible 代理。 同样,每当在基于 HWND 的控件上创建、销毁、移动、调整大小或执行任何其他操作时,系统都会自动生成相应的 WinEvent。

系统自动支持某些 WinEvent,包括常规 HWND 事件。 Microsoft Active Accessibility 服务器支持其他类型的 WinEvents,例如特定于特定控件的状态更改或选择事件。

当发生影响 UI 的事件时,服务器可以通过调用 NotifyWinEvent 函数将事件通知广播给所有感兴趣的客户端。 函数调用包括用于标识所发生事件的类型和应用该事件的 UI 元素的信息。 客户端可以使用此信息来检索 UI 元素的 IAccessible 对象并收集更多信息。

例如,为了通知客户端控件的名称已更改,服务器会调用 NotifyWinEvent 并在 event 参数中传递 EVENT_OBJECT_NAMECHANGE 。 系统通过确定哪些客户端已注册以接收该特定事件并调用其注册的回调函数来做出响应。 如果没有客户端注册事件,则服务器对 NotifyWinEvent 的调用相当于“无操作”,并且性能影响可以忽略不计。

服务器调用 NotifyWinEvent 以在事件发生后向系统报出事件。 它们不得在事件发生之前通知系统事件。

若要收到事件通知,客户端可以使用 SetWinEventHook 注册回调挂钩函数。 客户端为所有可能的事件设置单个挂钩函数,或为离散事件范围设置多个挂钩函数。 有关详细信息,请参阅 注册挂钩函数

当 Microsoft Active Accessibility 收到事件通知时,它会调用为该事件注册的任何挂钩函数,并传递 NotifyWinEvent 中的参数。