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::FindFirstIUIAutomationElement::FindAll 导航到特定的子级或后代。 例如,可以轻松检索对话框中支持指定控件模式的所有元素。

UI 自动化中的导航比在 Microsoft Active Accessibility 中更一致。 某些元素(如下拉列表和弹出窗口)在 Microsoft Active Accessibility 树中出现两次,这些元素的导航可能会产生意外结果。 很难为 rebar 控件正确实现 Microsoft Active Accessibility。 UI 自动化支持重定父级和重新定位,以便元素可以放置在树中的任何位置,尽管窗口的所有权施加了层次结构。

角色和控件类型

Microsoft Active Accessibility 使用 iAccessible::get_accRole) (accRole 属性来检索 UI 中元素角色的说明,例如 ROLE_SYSTEM_SLIDERROLE_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 自动化控件类型。

Active Accessibility 角色 UI 自动化控件类型
ROLE_SYSTEM_PUSHBUTTON Button
ROLE_SYSTEM_CLIENT 日历
ROLE_SYSTEM_CHECKBUTTON CheckBox
ROLE_SYSTEM_COMBOBOX ComboBox
ROLE_SYSTEM_CLIENT 请参阅 自定义控件类型
ROLE_SYSTEM_LIST DataGrid
ROLE_SYSTEM_LISTITEM DataItem
ROLE_SYSTEM_DOCUMENT Document
ROLE_SYSTEM_TEXT 编辑
ROLE_SYSTEM_GROUPING
ROLE_SYSTEM_LIST 标头
ROLE_SYSTEM_COLUMNHEADER HeaderItem
ROLE_SYSTEM_LINK 超链接
ROLE_SYSTEM_GRAPHIC 图像
ROLE_SYSTEM_LIST 列表
ROLE_SYSTEM_LISTITEM ListItem
ROLE_SYSTEM_MENUPOPUP 菜单
ROLE_SYSTEM_MENUBAR MenuBar
ROLE_SYSTEM_MENUITEM MenuItem
ROLE_SYSTEM_PANE 窗格
ROLE_SYSTEM_PROGRESSBAR ProgressBar
ROLE_SYSTEM_RADIOBUTTON RadioButton
ROLE_SYSTEM_SCROLLBAR 滚动条
ROLE_SYSTEM_SEPARATOR 分隔符
ROLE_SYSTEM_SLIDER 滑块
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_SPLITBUTTON SplitButton
ROLE_SYSTEM_STATUSBAR StatusBar
ROLE_SYSTEM_PAGETABLIST 选项卡
ROLE_SYSTEM_PAGETAB TabItem
ROLE_SYSTEM_TABLE
ROLE_SYSTEM_STATICTEXT 文本
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_TITLEBAR 标题栏
ROLE_SYSTEM_TOOLBAR 工具栏
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE
ROLE_SYSTEM_OUTLINEITEM TreeItem
ROLE_SYSTEM_WINDOW 窗口

 

状态和属性

Microsoft Active Accessibility 元素支持一组通用属性。 某些属性(如 accState)必须描述不同的条件,具体取决于元素角色。 服务器必须实现返回属性的所有 IAccessible 方法,甚至那些与 元素无关的属性。

UI 自动化定义其他属性,其中一些属性对应于 Microsoft Active Accessibility 中的状态。 某些属性对所有元素通用,但其他属性特定于控件类型和控件模式。 UI 自动化提供程序不必实现不相关的属性,但可以为它不支持的任何属性返回 null 值。 UI 自动化核心服务可以从默认窗口提供程序获取某些属性,这些属性与提供程序显式实现的属性合并。

除了支持更多属性外,UI 自动化还允许缓存属性,从而提高性能。

下表显示了两个模型中某些属性之间的对应关系。 有关UI 自动化属性 ID 的说明,请参阅 Automation Element 属性标识符

Active Accessibility 属性访问器 UI 自动化属性 ID 备注
get_accKeyboardShortcut UIA_AccessKeyPropertyIdUIA_AcceleratorKeyPropertyId 如果两者都存在,则UIA_AccessKeyPropertyId优先。
get_accName UIA_NamePropertyId
get_accRole UIA_ControlTypePropertyId 有关将角色映射到控件类型,请参阅上表。
get_accValue UIA_ValueValuePropertyIdUIA_RangeValueValuePropertyId 仅对支持 IUIAutomationValuePatternIUIAutomationRangeValuePattern 的控件类型有效。 范围值规范化为 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。

Active Accessibility 状态 UI 自动化属性 触发 WinEvent 状态更改?
STATE_SYSTEM_CHECKED 检查框的UIA_ToggleToggleStatePropertyId。 单选按钮的UIA_SelectionItemIsSelectedPropertyId Y
STATE_SYSTEM_COLLAPSED UIA_ExpandCollapseExpandCollapseStatePropertyId (值 = ExpandCollapseState_Collapsed) 。 Y
STATE_SYSTEM_EXPANDED UIA_ExpandCollapseExpandCollapseStatePropertyId (值 = ExpandCollapseState_ExpandedExpandCollapseState_PartiallyExpanded) 。 Y
STATE_SYSTEM_FOCUSABLE UIA_IsKeyboardFocusablePropertyId N
STATE_SYSTEM_FOCUSED UIA_HasKeyboardFocusPropertyId N
STATE_SYSTEM_HASPOPUP 菜单项的UIA_ExpandCollapseExpandCollapseStatePropertyId N
STATE_SYSTEM_INVISIBLE UIA_IsOffscreenPropertyId (值 = True 且 IUIAutomationElement::GetClickablePoint) 失败。 N
STATE_SYSTEM_LINKED UIA_ControlTypePropertyId (值 = UIA_HyperlinkControlTypeId) 。 N
STATE_SYSTEM_MIXED UIA_ToggleToggleStatePropertyId (值 = ToggleState_Indeterminate N
STATE_SYSTEM_MOVEABLE UIA_TransformCanMovePropertyId N
STATE_SYSTEM_MULTISELECTABLE UIA_SelectionCanSelectMultiplePropertyId N
STATE_SYSTEM_OFFSCREEN UIA_IsOffscreenPropertyId N
STATE_SYSTEM_PROTECTED UIA_IsPasswordPropertyId N
STATE_SYSTEM_READONLY UIA_RangeValueIsReadOnlyPropertyIdUIA_ValueIsReadOnlyPropertyId N
STATE_SYSTEM_SELECTABLE UIA_IsSelectionItemPatternAvailablePropertyId N
STATE_SYSTEM_SELECTED UIA_SelectionItemIsSelectedPropertyId N
STATE_SYSTEM_SIZEABLE UIA_TransformCanResizePropertyId N
STATE_SYSTEM_UNAVAILABLE UIA_IsEnabledPropertyId Y

 

有关属性 ID 的完整列表,请参阅 属性标识符

事件

与 Microsoft Active Accessibility 不同,UI 自动化 中的事件机制不依赖于与窗口句柄密切相关的 Windows 事件路由,并且不需要客户端应用程序设置挂钩。 对事件的订阅可以微调到树的特定部分,而不仅仅是特定事件。 提供程序还可以通过跟踪正在侦听的事件来微调引发的事件。

客户端还可以更轻松地检索引发事件的元素,因为这些元素将直接传递给事件回调。 如果在客户端订阅事件时提供了缓存请求,则会自动预提取元素的属性。

下表显示了 Microsoft Active Accessibility 事件常量和UI 自动化事件 ID 的对应关系。

WinEvent UI 自动化事件 ID
EVENT_OBJECT_ACCELERATORCHANGE UIA_AcceleratorKeyPropertyId 属性更改。
EVENT_OBJECT_CONTENTSCROLLED UIA_ScrollVerticalScrollPercentPropertyIdUIA_ScrollHorizontalScrollPercentPropertyId 关联滚动条上的属性更改。
EVENT_OBJECT_CREATE UIA_StructureChangedEventId
EVENT_OBJECT_DEFACTIONCHANGE 无等效项。
EVENT_OBJECT_DESCRIPTIONCHANGE 没有确切的等效项;可能 UIA_HelpTextPropertyIdUIA_LocalizedControlTypePropertyId 属性更改。
EVENT_OBJECT_DESTROY UIA_StructureChangedEventId
EVENT_OBJECT_FOCUS UIA_AutomationFocusChangedEventId
EVENT_OBJECT_HELPCHANGE UIA_HelpTextPropertyId 更改。
EVENT_OBJECT_HIDE UIA_StructureChangedEventId
EVENT_OBJECT_LOCATIONCHANGE UIA_BoundingRectanglePropertyId 属性更改。
EVENT_OBJECT_NAMECHANGE UIA_NamePropertyId 属性更改。
EVENT_OBJECT_PARENTCHANGE UIA_StructureChangedEventId
EVENT_OBJECT_REORDER 在 Microsoft Active Accessibility 中不一致地使用。 在 UI 自动化中没有定义直接对应的事件。
EVENT_OBJECT_SELECTION UIA_SelectionItem_ElementSelectedEventId
EVENT_OBJECT_SELECTIONADD UIA_SelectionItem_ElementAddedToSelectionEventId
EVENT_OBJECT_SELECTIONREMOVE UIA_SelectionItem_ElementRemovedFromSelectionEventId
EVENT_OBJECT_SELECTIONWITHIN 无等效项。
EVENT_OBJECT_SHOW UIA_StructureChangedEventId
EVENT_OBJECT_STATECHANGE 各种属性更改事件。
EVENT_OBJECT_VALUECHANGE UIA_RangeValueValuePropertyIdUIA_ValueValuePropertyId 已更改。
EVENT_SYSTEM_ALERT 无等效项。
EVENT_SYSTEM_CAPTUREEND 无等效项。
EVENT_SYSTEM_CAPTURESTART 无等效项。
EVENT_SYSTEM_CONTEXTHELPEND 无等效项。
EVENT_SYSTEM_CONTEXTHELPSTART 无等效项。
EVENT_SYSTEM_DIALOGEND UIA_Window_WindowClosedEventId
EVENT_SYSTEM_DIALOGSTART UIA_Window_WindowOpenedEventId
EVENT_SYSTEM_DRAGDROPEND 无等效项。
EVENT_SYSTEM_DRAGDROPSTART 无等效项。
EVENT_SYSTEM_FOREGROUND UIA_AutomationFocusChangedEventId
EVENT_SYSTEM_MENUEND UIA_MenuModeEndEventId
EVENT_SYSTEM_MENUPOPUPEND UIA_MenuClosedEventId
EVENT_SYSTEM_MENUPOPUPSTART UIA_MenuOpenedEventId
EVENT_SYSTEM_MENUSTART UIA_MenuModeStartEventId
EVENT_SYSTEM_MINIMIZEEND UIA_WindowWindowVisualStatePropertyId 属性更改。
EVENT_SYSTEM_MINIMIZESTART UIA_WindowWindowVisualStatePropertyId 属性更改。
EVENT_SYSTEM_MOVESIZEEND UIA_BoundingRectanglePropertyId 属性更改。
EVENT_SYSTEM_MOVESIZESTART UIA_BoundingRectanglePropertyId 属性更改。
EVENT_SYSTEM_SCROLLINGEND UIA_ScrollVerticalScrollPercentPropertyIdUIA_ScrollHorizontalScrollPercentPropertyId 属性更改。
EVENT_SYSTEM_SCROLLINGSTART UIA_ScrollVerticalScrollPercentPropertyIdUIA_ScrollHorizontalScrollPercentPropertyId 属性更改。
EVENT_SYSTEM_SOUND 无等效项。
EVENT_SYSTEM_SWITCHEND 没有等效项,但 UIA_AutomationFocusChangedEventId 事件指示新应用程序已接收焦点。
EVENT_SYSTEM_SWITCHSTART 无等效项。
无等效项。 UIA_MultipleViewCurrentViewPropertyId 属性更改。
无等效项。 UIA_ScrollHorizontallyScrollablePropertyId 属性更改。
无等效项。 UIA_ScrollVerticallyScrollablePropertyId 属性更改。
无等效项。 UIA_ScrollHorizontalScrollPercentPropertyId 属性更改。
无等效项。 UIA_ScrollVerticalScrollPercentPropertyId 属性更改。
无等效项。 UIA_ScrollHorizontalViewSizePropertyId 属性更改。
无等效项。 UIA_ScrollVerticalViewSizePropertyId 属性更改。
无等效项。 UIA_ToggleToggleStatePropertyId 属性更改。
无等效项。 UIA_WindowWindowVisualStatePropertyId 属性更改
无等效项。 UIA_AsyncContentLoadedEventId 事件。
无等效项。 UIA_ToolTipOpenedEventId 事件。

 

从UI 自动化访问活动辅助功能属性和对象

UI 自动化在 Microsoft Active Accessibility 中不可用的一个重要功能是能够使用单个跨进程操作提取多个属性。

现有的 Microsoft Active Accessibility 客户端可以使用 IUIAutomationLegacyIAccessiblePattern 接口来利用此功能。 此接口表示在 UI 元素上公开 Microsoft Active Accessibility 属性和方法的 控件模式 。 检索元素时,应用程序可以请求缓存此控件模式及其属性。

IUIAutomationLegacyIAccessiblePattern 还使客户端能够从对 IAccessible 没有本机支持的元素获取 Microsoft Active Accessibility 属性。

IUIAutomationLegacyIAccessiblePattern 的属性更改不会引发UI 自动化事件。

将UI 自动化功能添加到活动辅助功能服务器

UI 自动化树概述

UI 自动化属性概述

UI 自动化控件类型概述

UI 自动化事件概述

Microsoft Active Accessibility