UI 自动化和活动辅助功能
Microsoft Active Accessibility 是 Windows 95 中引入的旧 API,旨在使 Windows 应用程序易于访问。 Microsoft UI 自动化 是适用于 Windows 的新辅助功能模型,旨在满足辅助技术产品和自动测试工具的需求。 UI 自动化提供了许多对 Microsoft Active Accessibility 的改进。 本主题介绍这两种技术之间的差异。
本主题包含以下各节:
编程语言
Microsoft Active Accessibility 基于组件对象模型 (COM) ,支持双接口,因此在 C/C++ 和脚本语言中是可编程的。
引入 UI 自动化 时,客户端 API 仅限于托管代码,而提供程序 API 同时包括托管和非托管实现。 在 Windows 7 中,引入了基于 COM 的新客户端 API,以便更轻松地在 C/C++ 中UI 自动化客户端应用程序编程。
服务器和客户端
在 Microsoft Active Accessibility 中,服务器和客户端直接通信,主要通过 IAccessible 接口的服务器实现进行通信。
在 UI 自动化 中,核心服务位于服务器 (提供程序) 和客户端之间。 核心服务调用提供程序实现的接口,并提供其他服务,例如为 UI 元素生成唯一的运行时标识符。 客户端应用程序通过创建 CUIAutomation 对象获取对此核心服务的访问权限。 此对象支持一组独立于提供程序接口的客户端接口。 有关详细信息,请参阅 创建 CUIAutomation 对象。
UI 自动化提供程序可以向 Microsoft Active Accessibility 客户端提供信息,Microsoft Active Accessibility 服务器可以向UI 自动化客户端应用程序提供信息。 但是,由于 Microsoft Active Accessibility 不会公开UI 自动化那么多的信息,因此这两个模型并不完全兼容。
UI 元素
Microsoft Active Accessibility 将 UI 元素显示为与子标识符配对的 IAccessible 接口。 很难比较两个 IAccessible 指针以确定它们是否引用同一个元素。
在 UI 自动化 中,每个元素都表示为向客户端公开 IUIAutomationElement 接口的对象。 元素可以通过运行时标识符进行比较,这些标识符是使用 IUIAutomationElement::GetRuntimeId 检索的。
树视图和导航
屏幕上的 UI 元素可以视为树结构,桌面作为根,应用程序窗口作为直接子级,应用程序内的元素作为后续后代。
在 Microsoft Active Accessibility 中,树结构中公开了许多与最终用户无关的 UI 元素。 客户端应用程序必须检查树中的所有元素,以确定哪些元素有意义。
UI 自动化客户端应用程序通过筛选视图查看 UI。 视图仅包含向用户提供信息或用户可以与之交互的元素。 仅包含控件元素和内容元素的预定义视图可用,客户端应用程序可以定义自定义视图。 UI 自动化可以更轻松地向用户描述 UI,并帮助用户与应用程序交互。
在 Microsoft Active Accessibility 中,元素之间的导航是空间导航,例如,移动到位于屏幕左侧的元素、逻辑(例如,移动到对话框中的 Tab 键顺序中的下一个菜单项或下一项),或者分层(例如,移动到容器中的第一个子元素,或从子元素移动到其父元素)。 分层导航很复杂,因为子元素并不总是实现 IAccessible 的对象。
在 UI 自动化 中,所有 UI 元素都是公开 IUIAutomationElement 接口并支持相同基本功能的 COM 对象。 从提供程序的角度来看,COM 对象实现从 IRawElementProviderSimple 继承的接口。 导航主要是分层的:也就是说,从父母到孩子,从一个同级到下一个。 但是,同级之间的导航具有逻辑元素,因为它可能遵循 Tab 键顺序。 客户端可以使用 IUIAutomationTreeWalker 从任何起始点(使用树的任何筛选视图)导航。 客户端还可以使用 IUIAutomationElement::FindFirst 和 IUIAutomationElement::FindAll 导航到特定的子级或后代。 例如,可以轻松检索对话框中支持指定控件模式的所有元素。
UI 自动化中的导航比在 Microsoft Active Accessibility 中更一致。 某些元素(如下拉列表和弹出窗口)在 Microsoft Active Accessibility 树中出现两次,这些元素的导航可能会产生意外结果。 很难为 rebar 控件正确实现 Microsoft Active Accessibility。 UI 自动化支持重定父级和重新定位,以便元素可以放置在树中的任何位置,尽管窗口的所有权施加了层次结构。
角色和控件类型
Microsoft Active Accessibility 使用 iAccessible::get_accRole) (accRole 属性来检索 UI 中元素角色的说明,例如 ROLE_SYSTEM_SLIDER 或 ROLE_SYSTEM_MENUITEM。 元素的角色是确定其可用功能的主要线索。 使用固定方法(如 IAccessible::accSelect 和 IAccessible::accDoDefaultAction)实现与控件的交互。 客户端应用程序与 UI 之间的交互仅限于可通过 IAccessible 执行的操作。
相比之下,UI 自动化将元素的控件类型(由 IUIAutomationElement::CurrentControlType (或 IUIAutomationElement::CachedControlType) 属性描述)与其预期功能分离。 功能由通过实现其特殊化接口的提供程序支持的控件模式来确定。 控件模式可以组合在一起,描述特定 UI 元素支持的整套功能。 某些提供程序需要支持特定的控件模式。 例如,检查框的提供程序必须支持切换控件模式。 需要其他提供程序才能支持一组或多种控件模式。 例如,按钮必须支持 Toggle 或 Invoke 控件模式。 还有一些则不支持控件模式。 例如,无法移动、调整大小或停靠的窗格没有控件模式。
UI 自动化支持自定义控件,这些控件由UIA_CustomControlTypeId常量标识,可由 IUIAutomationElement::CurrentLocalizedControlType (或 IUIAutomationElement::CachedLocalizedControlType) 属性描述。
下表将 Microsoft Active Accessibility对象角色映射到UI 自动化控件类型。
状态和属性
Microsoft Active Accessibility 元素支持一组通用属性。 某些属性(如 accState)必须描述不同的条件,具体取决于元素角色。 服务器必须实现返回属性的所有 IAccessible 方法,甚至那些与 元素无关的属性。
UI 自动化定义其他属性,其中一些属性对应于 Microsoft Active Accessibility 中的状态。 某些属性对所有元素通用,但其他属性特定于控件类型和控件模式。 UI 自动化提供程序不必实现不相关的属性,但可以为它不支持的任何属性返回 null 值。 UI 自动化核心服务可以从默认窗口提供程序获取某些属性,这些属性与提供程序显式实现的属性合并。
除了支持更多属性外,UI 自动化还允许缓存属性,从而提高性能。
下表显示了两个模型中某些属性之间的对应关系。 有关UI 自动化属性 ID 的说明,请参阅 Automation Element 属性标识符。
Active Accessibility 属性访问器 | UI 自动化属性 ID | 备注 |
---|---|---|
get_accKeyboardShortcut | UIA_AccessKeyPropertyId 或 UIA_AcceleratorKeyPropertyId | 如果两者都存在,则UIA_AccessKeyPropertyId优先。 |
get_accName | UIA_NamePropertyId | |
get_accRole | UIA_ControlTypePropertyId | 有关将角色映射到控件类型,请参阅上表。 |
get_accValue | UIA_ValueValuePropertyId 或 UIA_RangeValueValuePropertyId | 仅对支持 IUIAutomationValuePattern 或 IUIAutomationRangeValuePattern 的控件类型有效。 范围值规范化为 0-100,以便与 Microsoft Active Accessibility 行为保持一致。 值表示为字符串。 |
get_accHelp | UIA_HelpTextPropertyId | |
accLocation | UIA_BoundingRectanglePropertyId | |
get_accDescription | 不支持。 | accDescription 在 Microsoft Active Accessibility 中没有明确的规范,这导致服务器在此属性中放置了不同的信息片段。 |
get_accHelpTopic | 不支持。 |
下表显示了对应于 Microsoft Active Accessibility 对象状态常量的UI 自动化属性 ID。
有关属性 ID 的完整列表,请参阅 属性标识符。
事件
与 Microsoft Active Accessibility 不同,UI 自动化 中的事件机制不依赖于与窗口句柄密切相关的 Windows 事件路由,并且不需要客户端应用程序设置挂钩。 对事件的订阅可以微调到树的特定部分,而不仅仅是特定事件。 提供程序还可以通过跟踪正在侦听的事件来微调引发的事件。
客户端还可以更轻松地检索引发事件的元素,因为这些元素将直接传递给事件回调。 如果在客户端订阅事件时提供了缓存请求,则会自动预提取元素的属性。
下表显示了 Microsoft Active Accessibility 事件常量和UI 自动化事件 ID 的对应关系。
从UI 自动化访问活动辅助功能属性和对象
UI 自动化在 Microsoft Active Accessibility 中不可用的一个重要功能是能够使用单个跨进程操作提取多个属性。
现有的 Microsoft Active Accessibility 客户端可以使用 IUIAutomationLegacyIAccessiblePattern 接口来利用此功能。 此接口表示在 UI 元素上公开 Microsoft Active Accessibility 属性和方法的 控件模式 。 检索元素时,应用程序可以请求缓存此控件模式及其属性。
IUIAutomationLegacyIAccessiblePattern 还使客户端能够从对 IAccessible 没有本机支持的元素获取 Microsoft Active Accessibility 属性。
IUIAutomationLegacyIAccessiblePattern 的属性更改不会引发UI 自动化事件。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈