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 Automation 那样公开那么多信息,因此这两种模型并不完全兼容。
用户界面元素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 使用 accRole 属性 ( IAccessible::get_accRole ) 来检索 UI 中元素角色的描述,例如ROLE_SYSTEM_SLIDER或ROLE_SYSTEM_MENUITEM。元素的角色是其可用功能的主要线索。与控件的交互是通过使用诸如IAccessible::accSelect和IAccessible::accDoDefaultAction 之类的固定方法来实现的。客户端应用程序和 UI 之间的交互仅限于可以通过IAccessible完成的操作。
相比之下,UI 自动化将元素的控件类型(由IUIAutomationElement::CurrentControlType(或IUIAutomationElement::CachedControlType)属性描述)与其预期功能分离。功能由提供者通过其专用接口的实现所支持的控制模式确定。可以组合控制模式来描述特定 UI 元素支持的完整功能集。某些提供程序需要支持特定的控制模式。例如,复选框的提供者必须支持Toggle控制模式。其他提供程序需要支持一组控制模式中的一个或多个。例如,按钮必须支持 Toggle 或Invoke控件模式。还有一些不支持控制模式。例如,无法移动、调整大小或停靠的窗格没有控制模式。
UI 自动化支持自定义控件,这些控件由UIA_CustomControlTypeId常量标识,并且可以由IUIAutomationElement::CurrentLocalizedControlType(或IUIAutomationElement::CachedLocalizedControlType)属性描述。
下表将 Microsoft Active Accessibility对象角色映射到 UI 自动化控件类型。
角色和控制类型 主动辅助功能角色 UI自动化控制类型 ROLE_SYSTEM_PUSHBUTTON 按钮 ROLE_SYSTEM_CLIENT 日历 ROLE_SYSTEM_CHECKBUTTON 复选框 ROLE_SYSTEM_COMBOBOX 组合框 ROLE_SYSTEM_CLIENT 请参阅自定义控件类型。 ROLE_SYSTEM_LIST 数据网格 ROLE_SYSTEM_LISITEM 数据项 ROLE_SYSTEM_DOCUMENT 文档 ROLE_SYSTEM_TEXT 编辑 ROLE_SYSTEM_GROUPING 团体 ROLE_SYSTEM_LIST 标题 ROLE_SYSTEM_COLUMNHEADER 标题项 ROLE_SYSTEM_LINK 超链接 ROLE_SYSTEM_GRAPHIC 图像 ROLE_SYSTEM_LIST 列表 ROLE_SYSTEM_LISITEM 项目清单 ROLE_SYSTEM_MENUPOPUP 菜单 ROLE_SYSTEM_MENUBAR 菜单栏 ROLE_SYSTEM_MENUITEM 菜单项 ROLE_SYSTEM_PANE 窗格 ROLE_SYSTEM_PROGRESSBAR 进度条 ROLE_SYSTEM_RADIOBUTTON 单选按钮 ROLE_SYSTEM_SCROLLBAR 滚动条 ROLE_SYSTEM_SEPARATOR 分隔器 ROLE_SYSTEM_SLIDER 滑块 ROLE_SYSTEM_SPINBTON 纺纱机 ROLE_SYSTEM_SPLITBUTTON 拆分按钮 ROLE_SYSTEM_STATUSBAR 状态栏 ROLE_SYSTEM_PAGETABLIST 标签 ROLE_SYSTEM_PAGETAB 标签项 ROLE_SYSTEM_TABLE 桌子 ROLE_SYSTEM_STATICTEXT 文本 ROLE_SYSTEM_INDICATOR 拇指 ROLE_SYSTEM_TITLEBAR 标题栏 ROLE_SYSTEM_TOOLBAR 工具栏 ROLE_SYSTEM_TOOLTIP 工具提示 ROLE_SYSTEM_OUTLINE 树 ROLE_SYSTEM_OUTLINEITEM 树项 ROLE_SYSTEM_WINDOW 窗户
状态和属性Microsoft Active Accessibility 元素支持一组通用的属性。某些属性(例如 accState)必须根据元素角色描述不同的条件。服务器必须实现IAccessible 的所有返回属性的方法,即使是那些与元素无关的属性。
UI 自动化定义了其他属性,其中一些与 Microsoft Active Accessibility 中的状态相对应。某些属性对所有元素都是通用的,但其他属性特定于控件类型和控件模式。UI 自动化提供程序不必实现不相关的属性,但可以为其不支持的任何属性返回空值。UI 自动化核心服务可以从默认窗口提供程序获取一些属性,这些属性与提供程序显式实现的属性合并。
除了支持更多属性之外,UI 自动化还通过允许缓存属性来实现更好的性能。
下表显示了两个模型中某些属性之间的对应关系。有关 UI 自动化属性 ID 的说明,请参阅自动化元素属性标识符。
状态和属性 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 位置 UIA_BoundingRectanglePropertyId get_acc 描述 不支持。 accDescription 在 Microsoft Active Accessibility 中没有明确的规范,这导致服务器在此属性中放置了不同的信息。 get_accHelpTopic 不支持。
下表显示了对应于 Microsoft Active Accessibility对象状态常量的 UI 自动化属性 ID 。
表3 活动辅助功能状态 UI 自动化属性 触发 WinEvent 状态更改? STATE_SYSTEM_CHECKED 复选框的UIA_ToggleToggleStatePropertyId。UIA_SelectionItemIsSelectedPropertyId用于单选按钮。 是 STATE_SYSTEM_COLLAPSED UIA_ExpandCollapseExpandCollapseStatePropertyId(值 = ExpandCollapseState_Collapsed)。 是 STATE_SYSTEM_EXPANDED UIA_ExpandCollapseExpandCollapseStatePropertyId(值 = ExpandCollapseState_Expanded或ExpandCollapseState_PartiallyExpanded)。 是 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_RangeValueIsReadOnlyPropertyId和UIA_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。 是
有关属性 ID 的完整列表,请参阅属性标识符。
活动 与 Microsoft Active Accessibility 不同的是,UI 自动化中的事件机制不依赖于与窗口句柄密切相关的 Windows 事件路由,并且不需要客户端应用程序设置挂钩。事件订阅可以微调到树的特定部分,而不仅仅是特定事件。提供者还可以通过跟踪正在侦听的事件来微调引发事件。
客户端检索引发事件的元素也更容易,因为这些元素直接传递给事件回调。如果在客户端订阅事件时提供了缓存请求,则会自动预取元素的属性。
下表显示了 Microsoft Active Accessibility事件常量和 UI 自动化事件 ID 的对应关系。
活动赢事件 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_HelpTextPropertyId或UIA_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_RangeValueValuePropertyId和UIA_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_ScrollVerticalScrollPercentPropertyId或UIA_ScrollHorizontalScrollPercentPropertyId属性更改。 EVENT_SYSTEM_SCROLLINGSTART UIA_ScrollVerticalScrollPercentPropertyId或UIA_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 自动化访问 Active Accessibility 属性和对象Microsoft Active Accessibility 中不可用的 UI 自动化的一个关键功能是能够通过单个跨进程操作获取多个属性。
现有的 Microsoft Active Accessibility 客户端可以通过使用IUIAutomationLegacyIAccessiblePattern接口来利用此功能。此接口表示一种控件模式,该模式在 UI 元素上公开 Microsoft Active Accessibility 属性和方法。检索元素时,应用程序可以请求缓存此控件模式及其属性。
IUIAutomationLegacyIAccessiblePattern还使客户端能够从对IAccessible没有本机支持的元素获取 Microsoft Active Accessibility 属性。
IUIAutomationLegacyIAccessiblePattern的属性更改不会引发 UI 自动化事件。