1

MSAA(Microsoft Active Accessibility)允许动态注释,其中可以设置控件的某些可访问性属性,而无需重新实现 MSAA 接口。具体来说server annotation(这是一种动态注释)可用于设置我们拥有其 IAccessible 接口的控件的属性。

使用UI 自动化如何实现类似的事情?(UI 自动化是 MSAA 的继承者,但有不同的做事方式。)

我有一个包含 2 列(ColA 和 colB)和几个组的列表控件的 MFC 应用程序。每个组有几个项目。项目始终在 colA 中有数据,但对于 colB,它们可能没有数据。当 colB 为空时(图像中的第 3 项), Microsoft 可访问性见解会显示这些情况下的错误。错误:"The name property of a focusable element must not be null"

带有列表控件的 MFC 对话框

使用 MSAA 服务器注释(这是一种动态注释),我可以获得每个项目的 colB 并设置名称属性,或者使其不可聚焦(两者都将消除错误)。问题是 MSAA 没有公开列表项的这个子项(colB 数据)。然而,它由 UI 自动化公开。

这意味着对于项目I am able to get IUIAutomationElement interface, but not IAccessible interface.

下图显示了AccExplorer32.exe 工具显示的层次结构。此工具使用 IAccessible 接口 (MSAA)。

AccExplorer32.exe 层次结构

下图显示了可访问性见解显示的层次结构。该工具主要使用 IUIAutomationElement 接口(MS UI Automation)。

可访问性洞察工具

我们可以看到 colB 没有在 AccExplorer32 显示的层次结构中单独公开,但它在 Accessibility 洞察力显示的层次结构中公开。

因此,对于该项目,我能够获得 IUIAutomationElement 接口,但不能获得 IAccessible 接口。由 MS 记录的服务器注释需要 IAccessible。根据 MSAA 和 MS UI 自动化(见此)都支持 MS 动态注释。因此也应该支持服务器注释。

开发人员可以使用动态注释 API 来注释 Microsoft UI 自动化属性以及 Microsoft Active Accessibility 属性

有没有办法在 UI 自动化中使用像动态注释这样的服务器注释?

我已经尝试过以下方法。

  1. 在子项的 IUIAutomationElement 上使用 QueryInterface 来获取 ILegacyIAccessibleProvider(我可以通过 GetIAccessible() 方法获得 IAccessible)。但是 QueryInterface() 失败,表明没有这样的接口。
  2. 使用 UI 自动化代理进行了探索(请参阅此)。这些用于为现有服务器增加新的属性和模式。它们不用于设置现有属性的值。

源代码:https ://github.com/lihas/WindowsAccessibilitySamples/tree/master/02MFCListControlAccessibility

4

0 回答 0