Share via


消費者介面自動化和作用中協助工具

Microsoft Active Accessibility 是 Windows 95 中引進的舊版 API,其設計目的是要讓 Windows 應用程式可供存取。 Microsoft 消費者介面自動化 是適用于 Windows 的新協助工具模型,旨在解決輔助技術產品和自動化測試控管的需求。 消費者介面自動化提供許多 Microsoft Active Accessibility 的改善。 本主題說明這兩種技術之間的差異。

本主題包含下列各節。

程式語言:

Microsoft Active Accessibility 是以元件物件模型為基礎, (COM) 支援雙重介面,因此可使用 C/C++ 和指令碼語言進行程式化。

引進消費者介面自動化時,用戶端 API 僅限於 Managed 程式碼,而提供者 API 同時包含 Managed 和 Unmanaged 實作。 使用 Windows 7 時,引進了新的 COM 型用戶端 API,可讓您更輕鬆地以 C/C++ 程式設計消費者介面自動化用戶端應用程式。

伺服器和用戶端

在 Microsoft Active Accessibility 中,伺服器和用戶端會直接通訊,主要是透過 IAccessible 介面的伺服器實作進行通訊。

在消費者介面自動化中,核心服務位於伺服器 (提供者) 與用戶端之間。 核心服務會呼叫提供者所實作的介面,並提供額外的服務,例如產生 UI 元素的唯一執行時間識別碼。 用戶端應用程式可藉由建立 CUIAutomation 物件來存取此核心服務。 這個物件支援一組與提供者介面分開的用戶端介面。 如需詳細資訊,請參閱 建立 CUIAutomation 物件

消費者介面自動化提供者可以將資訊提供給 Microsoft Active Accessibility 用戶端,而 Microsoft Active Accessibility 伺服器可以提供消費者介面自動化用戶端應用程式的資訊。 不過,由於 Microsoft Active Accessibility 不會公開與消費者介面自動化相同的資訊,因此這兩個模型不完全相容。

UI 項目

Microsoft Active Accessibility 會將 UI 元素呈現為與子識別碼配對的 IAccessible 介面。 比較兩個 IAccessible 指標很難判斷它們是否參考相同的元素。

在消費者介面自動化中,每個元素都會以物件的形式呈現,該物件會將IUIAutomationElement介面公開給用戶端。 元素可以與其執行時間識別碼進行比較,這些識別碼是使用 IUIAutomationElement::GetRuntimeId擷取的。

樹狀檢視和導覽

螢幕上的 UI 元素可視為樹狀結構,其中桌面為根目錄、應用程式視窗為立即子系,以及應用程式內的元素作為進一步子系。

在 Microsoft Active Accessibility 中,許多與終端使用者無關的 UI 元素都會在樹狀結構中公開。 用戶端應用程式必須檢查樹狀結構中的所有專案,以判斷哪些元素有意義。

UI 自動化用戶端應用程式會透過篩選的檢視來查看 UI。 檢視只包含提供資訊給使用者或使用者可以與其互動的專案。 僅包含控制項元素和內容元素的預先定義檢視可供使用,而用戶端應用程式可以定義自訂檢視。 消費者介面自動化可讓您更輕鬆地向使用者描述 UI,並協助使用者與應用程式互動。

在 Microsoft Active Accessibility 中,元素之間的流覽是空間的,例如,移至位於畫面左側的專案,例如,移至對話方塊的索引標籤順序中的下一個功能表項目或下一個專案,例如,移至容器中的第一個子項目,或從子項目移至其父元素。 階層式導覽很複雜,因為子項目不一定是實作 IAccessible的物件。

在消費者介面自動化中,所有 UI 元素都是公開IUIAutomationElement介面並支援相同基本功能的 COM 物件。 從提供者的觀點來看,COM 物件會實作繼承自 IRawElementProviderSimple 的介面。 流覽主要為階層式;也就是說,從父系到子系,以及從一個同層級到下一個同層級。 不過,同層級之間的流覽具有邏輯元素,因為它可能遵循定位順序。 用戶端可以使用 IUIAutomationTreeWalker,從樹狀結構的任何篩選檢視,從任何起點巡覽。 用戶端也可以使用 IUIAutomationElement::FindFirstIUIAutomationElement::FindAll流覽至特定的子系或子系。 例如,很容易擷取對話方塊中支援指定控制項模式的所有元素。

消費者介面自動化中的導覽比 Microsoft Active Accessibility 更一致。 某些元素,例如下拉式清單和快顯視窗,會在 Microsoft Active Accessibility 樹狀目錄中出現兩次,而從這些專案流覽可能會有非預期的結果。 很難為 Rebar 控制項正確實作 Microsoft Active Accessibility。 消費者介面自動化啟用重新父代和重新置放,讓專案可以放置在樹狀結構中的任何位置,即使視窗擁有權所加加的階層。

角色和控制項類型

Microsoft Active Accessibility 使用 accRole 屬性 (IAccessible::get_accRole) 來擷取 UI 中元素角色的描述,例如 ROLE_SYSTEM_SLIDERROLE_SYSTEM_MENUITEM。 從項目的角色可以了解他所能使用的功能。 使用 IAccessible::accSelectIAccessible::accDoDefaultAction等固定方法,即可與控制項互動。 用戶端應用程式與 UI 之間的互動僅限於透過 IAccessible完成的工作。

相反地,消費者介面自動化將元素的控制項類型分離,此類型是由IUIAutomationElement::CurrentControlType (或IUIAutomationElement::CachedControlType) 屬性所描述。 功能是由提供者透過其特定介面實作所支援的控制項模式來判斷。 可以結合控制項模式來描述特定 UI 元素所支援的完整功能集。 某些提供者需要支援特定控制項模式。 例如,核取方塊的提供者必須支援 切換 控制項模式。 其他提供者需要支援一或多個控制項模式。 例如,按鈕必須支援 [切換] 或 [ 用] 控制項模式。 其他仍然不支援控制項模式。 例如,無法移動、調整大小或停駐的窗格沒有控制項模式。

消費者介面自動化支援由UIA_CustomControlTypeId常數識別的自訂控制項,可由IUIAutomationElement::CurrentLocalizedControlType (或 IUIAutomationElement::CachedLocalizedControlType) 屬性來描述。

下表會將 Microsoft Active Accessibility物件角色對應至消費者介面自動化控制項類型。

Active Accessibility 角色 UI 自動化控制項類型
ROLE_SYSTEM_PUSHBUTTON 按鈕
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 文件
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 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 Table
ROLE_SYSTEM_STATICTEXT Text
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_TITLEBAR 標題列
ROLE_SYSTEM_TOOLBAR ToolBar
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE 樹狀結構
ROLE_SYSTEM_OUTLINEITEM TreeItem
ROLE_SYSTEM_WINDOW Window

 

狀態和屬性

Microsoft Active Accessibility 元素支援一組常見的屬性。 某些屬性,例如 accState,必須根據元素角色來描述不同的條件。 伺服器必須實作 IAccessible 的所有方法,以傳回屬性,即使是與專案無關的屬性也一定。

消費者介面自動化定義其他屬性,其中某些屬性會對應至 Microsoft Active Accessibility 中的狀態。 某些屬性適用于所有元素,但其他屬性則專屬於控制項類型和控制項模式。 消費者介面自動化提供者不需要實作無關的屬性,但可以針對不支援的任何屬性傳回 Null 值。 消費者介面自動化核心服務可以從預設視窗提供者取得某些屬性,而這些屬性會與提供者明確實作的屬性進行合併。

除了支援更多屬性外,消費者介面自動化允許快取屬性來提升效能。

下表顯示兩個模型中某些屬性之間的對應。 如需消費者介面自動化屬性識別碼的描述,請參閱Automation Element Property Identifiers

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物件狀態常數的消費者介面自動化屬性識別碼。

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

 

如需屬性識別碼的完整清單,請參閱 屬性識別碼

事件

不同于 Microsoft Active Accessibility,消費者介面自動化中的事件機制不會依賴與視窗控制碼緊密系結的 Windows 事件路由,而且不需要用戶端應用程式設定勾點。 事件的訂閱可以微調樹狀結構的特定部分,而不只是特定事件。 提供者也可以藉由追蹤正在接聽的事件,微調引發事件。

用戶端也更容易擷取引發事件的元素,因為這些專案會直接傳遞至事件回呼。 如果用戶端訂閱事件時提供快取要求,元素的屬性會自動預先擷取。

下表顯示 Microsoft Active Accessibility事件常數和消費者介面自動化事件識別碼的對應。

WinEvent 消費者介面自動化事件識別碼
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 事件。

 

從消費者介面自動化存取使用中協助工具屬性和物件

Microsoft Active Accessibility 中無法使用消費者介面自動化的主要功能,是能夠使用單一跨進程作業擷取多個屬性。

現有的 Microsoft Active Accessibility 用戶端可以使用 IUIAutomationLegacyIAccessiblePattern 介面來利用這項功能。 這個介面代表一種 控制項模式 ,可公開 UI 元素上的 Microsoft Active Accessibility 屬性和方法。 擷取專案時,應用程式可以要求快取此控制項模式及其屬性。

IUIAutomationLegacyIAccessiblePattern 也可讓用戶端從沒有 IAccessible原生支援的專案取得 Microsoft Active Accessibility 屬性。

IUIAutomationLegacyIAccessiblePattern的屬性變更不會引發消費者介面自動化事件。

將消費者介面自動化功能新增至作用中協助工具伺服器

UI 自動化樹狀目錄概觀

UI 自動化屬性概觀

UI 自動化控制項類型概觀

UI 自動化事件概觀

Microsoft Active Accessibility