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 中,元素之间的导航是空间,例如,移动到位于屏幕左侧的元素,逻辑例如,移动到对话框中的选项卡顺序中的下一个菜单项或下一项,例如,移动到容器中的第一个子元素或从子元素移动到其父元素。 分层导航很复杂,因为子元素并不总是实现 IAccessible 的对象。

在UI 自动化中,所有 UI 元素都是公开 IUIAutomationElement 接口并支持相同基本功能的 COM 对象。 从提供程序的角度来看,COM 对象实现从 IRawElementProviderSimple 继承的接口。 导航主要是分层的;也就是说,从父母到子级,从一个兄弟姐妹到另一个兄弟姐妹。 但是,同级之间的导航具有逻辑元素,因为它可能遵循 Tab 键顺序。 客户端可以使用 IUIAutomationTreeWalker 从任何起点(使用树的任何筛选视图)导航。 客户端还可以使用 IUIAutomationElement::FindFirstIUIAutomationElement::FindAll 导航到特定子级或后代。 例如,可以轻松检索支持指定控件模式的对话框中的所有元素。

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

角色和控件类型

Microsoft Active Accessibility 使用 accRole 属性 (IAccessible::get_accRole) 检索 UI 中元素角色的说明,例如 ROLE_SYSTEM_SLIDERROLE_SYSTEM_MENUITEM。 元素的角色是确定其可用功能的主要线索。 通过使用 IAccessible::accSelectIAccessible::accDoDefaultAction 等固定方法实现与控件的交互。 客户端应用程序和 UI 之间的交互仅限于可通过 IAccessible 执行的操作。

相反,UI 自动化将 IUIAutomationElement::CurrentControlType (或 IUIAutomationElement::CachedControlType) 属性描述的元素的控件类型与预期功能分离。 功能由通过实现其特殊化接口的提供程序支持的控件模式来确定。 可以组合控件模式来描述特定 UI 元素支持的完整功能集。 某些提供程序需要支持特定控件模式。 例如,复选框的提供程序必须支持 切换 控件模式。 需要其他提供程序才能支持一组或多种控件模式。 例如,按钮必须支持“切换”或 “调用 ”控件模式。 还有其他人不支持控制模式。 例如,无法移动、调整大小或停靠的窗格没有控件模式。

UI 自动化支持由UIA_CustomControlTypeId常量标识的自定义控件,可由 IUIAutomationElement::CurrentLocalizedControlType (或 IUIAutomationElement::CachedLocalizedControlType) 属性描述。

下表将 Microsoft Active Accessibilityobject 角色映射到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 ScrollBar
ROLE_SYSTEM_SEPARATOR 分隔符
ROLE_SYSTEM_SLIDER 滑块
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_SPLITBUTTON SplitButton
ROLE_SYSTEM_STATUSBAR StatusBar
ROLE_SYSTEM_PAGETABLIST Tab
ROLE_SYSTEM_PAGETAB TabItem
ROLE_SYSTEM_TABLE
ROLE_SYSTEM_STATICTEXT Text
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_ScrollVerticalScrollPercentPropertyId或UIA_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 自动化访问活动辅助功能属性和对象

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

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

IUIAutomationLegacyIAccessiblePattern 还允许客户端从对 IAccessible 没有本机支持的元素中获取 Microsoft Active 辅助功能属性。

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

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

UI 自动化树概述

UI 自动化属性概述

UI 自动化控件类型概述

UI 自动化事件概述

Microsoft Active Accessibility