消費者介面自動化和作用中協助工具
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::FindFirst 和 IUIAutomationElement::FindAll流覽至特定的子系或子系。 例如,很容易擷取對話方塊中支援指定控制項模式的所有元素。
消費者介面自動化中的導覽比 Microsoft Active Accessibility 更一致。 某些元素,例如下拉式清單和快顯視窗,會在 Microsoft Active Accessibility 樹狀目錄中出現兩次,而從這些專案流覽可能會有非預期的結果。 很難為 Rebar 控制項正確實作 Microsoft Active Accessibility。 消費者介面自動化啟用重新父代和重新置放,讓專案可以放置在樹狀結構中的任何位置,即使視窗擁有權所加加的階層。
角色和控制項類型
Microsoft Active Accessibility 使用 accRole 屬性 (IAccessible::get_accRole) 來擷取 UI 中元素角色的描述,例如 ROLE_SYSTEM_SLIDER 或 ROLE_SYSTEM_MENUITEM。 從項目的角色可以了解他所能使用的功能。 使用 IAccessible::accSelect 和 IAccessible::accDoDefaultAction等固定方法,即可與控制項互動。 用戶端應用程式與 UI 之間的互動僅限於透過 IAccessible完成的工作。
相反地,消費者介面自動化將元素的控制項類型分離,此類型是由IUIAutomationElement::CurrentControlType (或IUIAutomationElement::CachedControlType) 屬性所描述。 功能是由提供者透過其特定介面實作所支援的控制項模式來判斷。 可以結合控制項模式來描述特定 UI 元素所支援的完整功能集。 某些提供者需要支援特定控制項模式。 例如,核取方塊的提供者必須支援 切換 控制項模式。 其他提供者需要支援一或多個控制項模式。 例如,按鈕必須支援 [切換] 或 [ 叫 用] 控制項模式。 其他仍然不支援控制項模式。 例如,無法移動、調整大小或停駐的窗格沒有控制項模式。
消費者介面自動化支援由UIA_CustomControlTypeId常數識別的自訂控制項,可由IUIAutomationElement::CurrentLocalizedControlType (或 IUIAutomationElement::CachedLocalizedControlType) 屬性來描述。
下表會將 Microsoft Active Accessibility物件角色對應至消費者介面自動化控制項類型。
狀態和屬性
Microsoft Active Accessibility 元素支援一組常見的屬性。 某些屬性,例如 accState,必須根據元素角色來描述不同的條件。 伺服器必須實作 IAccessible 的所有方法,以傳回屬性,即使是與專案無關的屬性也一定。
消費者介面自動化定義其他屬性,其中某些屬性會對應至 Microsoft Active Accessibility 中的狀態。 某些屬性適用于所有元素,但其他屬性則專屬於控制項類型和控制項模式。 消費者介面自動化提供者不需要實作無關的屬性,但可以針對不支援的任何屬性傳回 Null 值。 消費者介面自動化核心服務可以從預設視窗提供者取得某些屬性,而這些屬性會與提供者明確實作的屬性進行合併。
除了支援更多屬性外,消費者介面自動化允許快取屬性來提升效能。
下表顯示兩個模型中某些屬性之間的對應。 如需消費者介面自動化屬性識別碼的描述,請參閱Automation Element Property Identifiers。
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物件狀態常數的消費者介面自動化屬性識別碼。
如需屬性識別碼的完整清單,請參閱 屬性識別碼。
事件
不同于 Microsoft Active Accessibility,消費者介面自動化中的事件機制不會依賴與視窗控制碼緊密系結的 Windows 事件路由,而且不需要用戶端應用程式設定勾點。 事件的訂閱可以微調樹狀結構的特定部分,而不只是特定事件。 提供者也可以藉由追蹤正在接聽的事件,微調引發事件。
用戶端也更容易擷取引發事件的元素,因為這些專案會直接傳遞至事件回呼。 如果用戶端訂閱事件時提供快取要求,元素的屬性會自動預先擷取。
下表顯示 Microsoft Active Accessibility事件常數和消費者介面自動化事件識別碼的對應。
從消費者介面自動化存取使用中協助工具屬性和物件
Microsoft Active Accessibility 中無法使用消費者介面自動化的主要功能,是能夠使用單一跨進程作業擷取多個屬性。
現有的 Microsoft Active Accessibility 用戶端可以使用 IUIAutomationLegacyIAccessiblePattern 介面來利用這項功能。 這個介面代表一種 控制項模式 ,可公開 UI 元素上的 Microsoft Active Accessibility 屬性和方法。 擷取專案時,應用程式可以要求快取此控制項模式及其屬性。
IUIAutomationLegacyIAccessiblePattern 也可讓用戶端從沒有 IAccessible原生支援的專案取得 Microsoft Active Accessibility 屬性。
IUIAutomationLegacyIAccessiblePattern的屬性變更不會引發消費者介面自動化事件。
相關主題
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應