如何托管 MSAA 无窗口 ActiveX 控件

了解如何创建可托管实现 Microsoft Active Accessibility 的无窗口 Microsoft ActiveX 控件的控件容器。 按照此处所述的步骤操作,可以确保控制容器中托管的任何基于 Microsoft Active Accessibility 的无窗口控件都可以通过辅助技术 (AT) 客户端应用程序进行访问。

需要了解的事项

技术

先决条件

  • C/C++
  • Microsoft Win32 和组件对象模型 (COM) 编程
  • 无窗口 ActiveX 控件
  • Microsoft Active Accessibility 服务器

Instructions

步骤 1:代表无窗口控件提供根 IAccessible 接口。

每当系统需要无窗口控件根的 IAccessible 指针时,系统会查询控件容器。 为了检索指针,容器调用无窗口控件的 IServiceProvider::QueryService 方法的实现。

如果控件容器具有 Microsoft Active Accessibility 实现,它可以返回指向系统的无窗口控件的 IAccessible 指针。

如果控件容器具有 Microsoft UI 自动化实现,请调用 UiaProviderFromIAccessible 函数以获取表示控件的 IRawElementProviderSimple 接口指针,然后将 IRawElementProviderSimple 接口指针返回到系统。

步骤 2:代表无窗口控件响应WM_GETOBJECT消息。

当客户端应用程序响应由无窗口控件引发的 WinEvent 时,控件容器将代表控件接收 WM_GETOBJECT 消息。 该消息包括引发事件的无窗口控件的对象 ID。

控件容器通过查找“拥有”对象 ID 的无窗口控件,然后调用该控件的 IAccessibleHandler::AccessibleObjectFromID 方法进行响应。 AccessibleObjectFromID 方法返回 UI 项的 IAccessible 接口指针,控件容器返回指向系统的指针,后者将其转发到客户端应用程序。

步骤 3:实现 IAccessibleWindowlessSite 接口。

  1. 实现 IAccessibleWindowlessSite::GetParentAccessible 方法。

    当客户端应用程序需要有关无窗口控件根提供程序的父级的辅助功能信息时,系统会调用无窗口控件的 IAccessible::get_accParent 方法。 控件通过调用控件容器的 IAccessibleWindowlessSite::GetParentAccessible 方法进行响应,该方法提供无窗口控件父级的 IAccessible 指针。

  2. 实现 IAccessibleWindowlessSite::AcquireObjectIdRangeQueryObjectIdRangeReleaseObjectIdRange 方法。

    控件容器必须维护对象 ID 范围到无窗口控件的映射。 映射使控件容器能够标识应响应对象 ID 的特定请求的控件。 下表显示了将对象 ID 范围映射到无窗口控件的示例。

    范围基数 范围大小 控制
    1000 500 控制 1
    1500 1000 控制 2
    2500 2000 控制 1

     

    控件容器必须维护自身和所有无窗口子级的对象 ID 范围到无窗口控件的映射。 对象 ID 范围不需要彼此相邻。 此外,为了避免拒绝服务攻击,控制容器可以对授予特定控件的范围数施加限制。 但是,允许每个控件多个范围,以使控件能够增长,这很有用。

步骤 4:可选:实现 IAccessibleHostingElementProviders 接口。

如果控件容器具有 Microsoft Active Accessibility 服务器实现,并且该服务器是包含支持UI 自动化的无窗口 ActiveX 控件的辅助功能树的根,则实现 IAccessibleHostingElementProviders 接口。 IAccessibleHostingElementProviders 接口具有单个方法 GetEmbeddedFragmentRoots,该方法检索控件容器托管的所有UI 自动化无窗口 ActiveX 控件的 IRawElementProviderFragmentRoot 接口指针。

如何托管UI 自动化无窗口 ActiveX 控件

无窗口 ActiveX 控件辅助功能