共用方式為


用戶介面自動化和Microsoft活動性輔助技術

備註

本檔適用於想要使用 System.Windows.Automation 命名空間中定義的受控UI自動化類別的 .NET Framework 開發人員。 如需 UI 自動化的最新資訊,請參閱 Windows 自動化 API:使用者介面自動化

Microsoft Active Accessibility 是讓應用程式可供存取的先前解決方案。 Microsoft UI 自動化是Microsoft Windows 的新輔助功能模型,旨在解決輔助技術產品和自動化測試工具的需求。 使用者介面自動化相比於 Active Accessibility 提供許多改進功能。

本主題包含UI自動化的主要功能,並說明這些功能與使用中輔助功能有何不同。

程式設計語言

使用中輔助功能是以支援雙重介面的元件物件模型 (COM) 為基礎,因此可在 C/C++、Microsoft Visual Basic 6.0 和腳本語言中程式化。 使用者介面自動化(包括標準控件的用戶端提供者連結庫)是以 Managed 程式代碼撰寫,而使用者介面自動化用戶端應用程式最容易使用 C# 或 Visual Basic .NET 進行程式設計。 UI 自動化提供者是介面實作,可以透過託管代碼或 C/C++ 撰寫。

Windows Presentation Foundation 中的支援

Windows Presentation Foundation (WPF) 是用來建立使用者介面的新模型。 WPF 元素不包含 Active Accessibility 的原生支援;不過,它們確實支持使用者介面自動化,其中包括對 Active Accessibility 用戶端的橋接支援。 只有專為使用者介面自動化撰寫的用戶端可以充分利用 WPF 的輔助功能功能,例如文字的豐富支援。

Servers 與 Clients

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

在UI自動化中,核心服務位於伺服器(稱為提供者)與客戶端之間。 核心服務會呼叫提供者所實作的介面,並提供其他服務,例如產生元素的唯一運行時間標識符。 用戶端應用程式會使用連結庫函式來呼叫UI自動化服務。

使用者介面自動化提供者可以將資訊提供給 Active Accessibility 用戶端,而 Active Accessibility 伺服器可以將資訊提供給使用者介面自動化客戶端。 不過,由於 Active Accessibility 不會公開與 UI 自動化一樣多的資訊,因此這兩個模型並不完全相容。

UI 項目

主動可及性會將 UI 元素呈現為 IAccessible 介面或子識別碼。 比較兩個 IAccessible 指標很難判斷它們是否參考相同的元素。

在UI自動化中,每個元素都會以 AutomationElement 物件表示。 比較是透過使用等號運算符或 Equals 方法來完成,兩者都會比較元素的唯一執行階段識別碼。

樹狀檢視和導覽

螢幕上的使用者介面 (UI) 元素可以視為樹狀結構,將桌面視為根目錄、應用程式視窗為直接子系,以及應用程式內的元素作為進一步子系。

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

UI 自動化用戶端應用程式會透過篩選的檢視來查看 UI。 檢視只包含相關的元素:讓使用者獲得資訊或進行互動的元素。 只有控件元素和內容元素的預先定義檢視可供使用;此外,應用程式也可以定義自定義檢視。 使用者介面自動化可簡化將UI描述給使用者的工作,並協助使用者與應用程式互動。

在主動輔助功能中,元素間的瀏覽可以是空間的(例如,移動到螢幕左側的元素)、邏輯的(例如,移動到下一個選單項目或對話框中按鍵順序的下一個項目),或階層式的(例如,移動到容器中的第一個子項,或從子項移動到其父項)。 階層式導覽很複雜,因為子元素不一定是實 IAccessible作 的物件。

在UI自動化中,所有UI元素都是 AutomationElement 支援相同基本功能的物件。 (從提供者的觀點來看,它們是實作繼承自 IRawElementProviderSimple之介面的物件。流覽主要是階層式:從父系到子系,以及從一個同層級到下一個。 (同層級節點之間的導航具有邏輯性,因為它可能遵循定位順序。)您可以使用 TreeWalker 類別,從樹狀結構的任何篩選檢視開始,從任何起點進行導航。 您也可以使用 FindFirstFindAll 來巡覽至特定的子代或後代。例如,在支援指定控制項模式的對話方塊中很容易擷取所有元素。

在 UI 自動化中,導航比在 Microsoft Active Accessibility 中更一致。 某些元素,例如下拉式清單和彈出視窗會在「Active Accessibility」樹狀結構中出現兩次,而從中瀏覽可能會有非預期的結果。 實際上無法正確地為 Rebar 控制項實作「主動式協助功能」。 使用者介面自動化可啟用重新指定父代和重新安置,因此元素可以放置在樹狀結構中的任何位置,儘管窗口擁有權施加的階層限制。

角色和控制項類型

中輔助功能使用accRole屬性(IAccessible::get_actRole)來擷取UI中元素角色的描述,例如ROLE_SYSTEM_SLIDER或ROLE_SYSTEM_MENUITEM。 從項目的角色可以了解他所能使用的功能。 使用固定方法如 IAccessible::accSelectIAccessible::accDoDefaultAction 來達成與控件的互動。 用戶端應用程式與UI之間的互動僅限於可透過 IAccessible完成的工作。

相反地,UI 自動化基本上會將元素的控件類型(由 ControlType 屬性所描述)與其預期的功能分離。 功能是由提供者透過其特定介面實作所支援的控制項模式來判斷。 您可以結合控制項模式來描述特定 UI 元素所支援的完整功能集。 某些提供者需要支援特定控制項模式;例如,複選框的提供者必須支援切換控件模式。 需要其他提供者才能支援一或多個控件模式;例如,按鈕必須支援切換或叫用。 還有其他人完全不支援控件模式:例如,無法移動、重設大小或停駐的窗格沒有任何控件模式。

UI 自動化支援自定義控件,這些控件是由 Custom 屬性識別,並可由 LocalizedControlTypeProperty 屬性描述。

下表顯示 Active Accessibility 角色與 UI 自動化控件類型的對應。

Active Accessibility 角色 UI 自動化控制件類型
系統按鈕角色 按鈕
系統客戶端角色 日曆
系統核取方塊角色 複選框
系統角色_下拉式選單 組合框
系統客戶端角色 習慣
ROLE_SYSTEM_LIST 資料網格
角色_系統_列表項目 資料項目
系統文件角色 文件
系統角色文本 編輯
角色系統分組 群體
ROLE_SYSTEM_LIST 頁首
系統欄位標題角色 標頭項目
系統連結角色 超連結
系統圖形角色 圖片
角色系統列表 清單
角色_系統_列表項目 清單項目
系統角色_選單彈出窗口 菜單
系統選單列角色 功能表欄
系統選單項目角色 選單項目
系統窗格角色 面板
系統進度條角色 進度列
角色系統單選按鈕 單選按鈕
ROLE_SYSTEM_滾動條 滾動條
系統分隔符角色 分隔符
系統滑桿角色 滑桿
系統旋鈕 旋轉器
系統分割按鈕角色 分割按鈕
系統狀態欄 狀態列
頁面標籤列表角色系统 Tab鍵
系統角色_頁籤 選項卡項目
角色系統表格
系統角色_靜態文本 文字
系統指示器角色 拇指
系統角色_標題列 標題列
系統工具欄角色 工具列
系統工具提示 工具提示
系統大綱角色
ROLE_SYSTEM_OUTLINEITEM 樹狀項目
系統視窗角色 窗戶

如需不同控件類型的詳細資訊,請參閱 UI自動化控件類型

狀態和屬性

在 Active Accessibility 中,元素具備一組共通的屬性,而某些屬性(例如accState)必須根據元素的角色來描述截然不同的事物。 伺服器必須實作所有回傳屬性的 IAccessible 方法,即使是那些與元素無關的方法。

UI 自動化定義了更多屬性,其中一些屬性對應於 Microsoft Active Accessibility 的狀態。 有些是所有元素的通用特性,但有些則是特定控制類型和控制模式的專屬特性。 屬性會以唯一標識符區分,而且大部分的屬性都可以使用單一方法 GetCurrentPropertyValueGetCachedPropertyValue來擷取。 許多屬性也可以輕鬆地從 CurrentCached 屬性存取子擷取。

使用者介面自動化提供者不需要實作不相關的屬性,但只要傳回 null 它不支援的任何屬性的值即可。 此外,使用者介面自動化核心服務可以從默認視窗提供者取得一些屬性,而這些屬性會與提供者明確實作的屬性合併。

除了支援更多屬性,使用者介面自動化也藉由允許使用單一跨進程呼叫來擷取多個屬性,以提供更佳的效能。

下表顯示兩個模型中屬性之間的對應。

Active Accessibility 屬性存取子 UI 自動化屬性 ID 備註
get_accKeyboardShortcut AccessKeyPropertyAcceleratorKeyProperty AccessKeyProperty 具有優先權,如果兩者都存在的話。
get_accName NameProperty
get_accRole ControlTypeProperty 如需將角色對應至控件類型,請參閱上表。
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
僅適用於支援 ValuePattern 或 RangeValuePattern 的控件類型。 RangeValue 值會正規化為 0-100,以符合 MSAA 行為。 值專案使用字串。
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription UI 自動化不支援 accDescription MSAA 內沒有明確的規格,這會導致提供者將不同的資訊片段放在此屬性中。
get_accHelpTopic UI 自動化不支援

下表顯示哪些 UI 自動化屬性對應至 Active Accessibility 狀態常數。

Active Accessibility 狀態 UI 自動化屬性 觸發狀態變更?
狀態系統已檢查 針對複選框, ToggleStateProperty

針對單選按鈕, IsSelectedProperty
系統狀態_已摺疊 ExpandCollapseState = Collapsed
系統狀態已展開 ExpandCollapseState = ExpandedPartiallyExpanded
可聚焦系統狀態 IsKeyboardFocusableProperty N
系統焦點狀態 HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP ExpandCollapsePattern 選單項目 N
系統不可見狀態 IsOffscreenProperty = True 並且 GetClickablePoint 導致 NoClickablePointException N
系統狀態連結 ControlTypeProperty =

Hyperlink
N
STATE_SYSTEM_MIXED ToggleState = Indeterminate N
STATE_SYSTEM_可移動 CanMoveProperty N
STATE_SYSTEM_MULTISELECTABLE CanSelectMultipleProperty N
系統狀態_離屏 IsOffscreenProperty = 真 N
狀態_系統_受保護 IsPasswordProperty N
系統狀態_唯讀 RangeValuePattern.IsReadOnlyPropertyValuePattern.IsReadOnlyProperty N
狀態系統可選 支援 SelectionItemPattern N
(系統狀態_選擇) IsSelectedProperty N
可調整大小的系統狀態 CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty

下列狀態不是由大部分的 Active Accessibility 控制伺服器實作,或在 UI 自動化中沒有相應的項目。

Active Accessibility 狀態 備註
系統忙碌狀態 UI 自動化中無法使用
系統預設狀態 UI 自動化中無法使用
系統狀態動畫 UI 自動化中無法使用
STATE_SYSTEM_EXTSELECTABLE Microsoft Active Accessibility 伺服器未被廣泛實作
STATE_SYSTEM_MARQUEED Microsoft Active Accessibility 伺服器未被廣泛實作
系統自動語音 Microsoft Active Accessibility 伺服器未被廣泛實作
系統狀態_已遍歷 UI 自動化中無法使用
系統警報:高危險等級 Microsoft Active Accessibility 伺服器未被廣泛實作
系統狀態警報中等級 Microsoft Active Accessibility 伺服器未被廣泛實作
系統警報低 Microsoft Active Accessibility 伺服器未被廣泛實作
STATE_SYSTEM_FLOATING Microsoft Active Accessibility 伺服器未被廣泛實作
系統狀態_熱追蹤 UI 自動化中無法使用
系統狀態_已按下 UI 自動化中無法使用

如需UI自動化屬性識別碼的完整清單,請參閱 UI自動化屬性概觀

事件

UI 自動化中的事件機制不同於 Active Accessibility 中的事件機制,不依賴於與視窗控制代碼緊密相連的 Windows 事件路由,也不需要用戶端應用程式設定鉤子。 事件的訂閱不僅可以微調至特定事件,還可以微調至樹狀結構中的特定部分。 提供者也可以藉由追蹤正在被監聽的事件來微調其事件觸發。

客戶端也更容易擷取引發事件的元素,因為這些元素會直接傳遞至事件回呼。 如果客戶端訂閱事件時快取請求處於活動狀態,則會自動預取元素的屬性。

下表顯示 Active Accessibility WinEvents 和 UI 自動化事件的對應。

WinEvent UI 自動化事件標識碼
事件_物件_加速器變更 AcceleratorKeyProperty 屬性變更
EVENT_OBJECT_CONTENTSCROLLED VerticalScrollPercentPropertyHorizontalScrollPercentProperty 的相關聯滾動條上屬性變更
事件_物件_創建 StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE 無對應項目
EVENT_OBJECT_DESCRIPTIONCHANGE(說明變更) 沒有確切的對等項目;或許 HelpTextPropertyLocalizedControlTypeProperty 屬性變更
物件銷毀事件 StructureChangedEvent
物件焦點事件 AutomationFocusChangedEvent
事件_物件_幫助變更 HelpTextProperty 改變
物件隱藏事件 StructureChangedEvent
事件_物件_位置變更 BoundingRectangleProperty 屬性變更
事件_物件_名稱變更 NameProperty 屬性變更
EVENT_OBJECT_PARENTCHANGE(物件父變更事件) StructureChangedEvent
EVENT_OBJECT_REORDER(事件物件重新排序) 在 Active Accessibility 中不一致地使用。 沒有任何直接對應的事件定義在 UI 自動化中。
事件物件選擇 ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
物件選擇內部事件 無對應項目
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE 各種屬性變更的事件
物件值變更事件 RangeValuePattern.ValuePropertyValuePattern.ValueProperty 已變更
** 系統警報 (EVENT_SYSTEM_ALERT) 無對應項目
EVENT_SYSTEM_CAPTUREEND 無對應項目
系統事件:開始捕捉 無對應項目
EVENT_SYSTEM_CONTEXTHELPEND 無對應項目
系統事件_內容說明啟動 無對應項目
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
系統對話方塊啟動事件 (EVENT_SYSTEM_DIALOGSTART) WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND 無對應項目
EVENT_SYSTEM_DRAGDROPSTART 無對應項目
EVENT_SYSTEM_FOREGROUND(系統事件前景) AutomationFocusChangedEvent
系統事件_選單結束 MenuClosedEvent
系統選單彈出結束事件 MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
事件系統最小化結束 WindowVisualStateProperty 屬性變更
系統事件_最小化開始 WindowVisualStateProperty 屬性變更
EVENT_SYSTEM_MOVESIZEEND BoundingRectangleProperty 屬性變更
EVENT_SYSTEM_MOVESIZESTART BoundingRectangleProperty 屬性變更
EVENT_SYSTEM_SCROLLINGEND VerticalScrollPercentPropertyHorizontalScrollPercentProperty 屬性變更
滾動開始事件 VerticalScrollPercentPropertyHorizontalScrollPercentProperty 屬性變更
系統事件_聲音 無對應項目
EVENT_SYSTEM_SWITCHEND 雖然沒有相對應的內容,但 AutomationFocusChangedEvent 事件顯示新應用程式已獲得焦點
系統事件_切換開始(EVENT_SYSTEM_SWITCHSTART) 無對應項目
無對應項目 CurrentViewProperty 屬性變更
無對應項目 HorizontallyScrollableProperty 屬性變更
無對應項目 VerticallyScrollableProperty 屬性變更
無對應項目 HorizontalScrollPercentProperty 屬性變更
無對應項目 VerticalScrollPercentProperty 屬性變更
無對應項目 HorizontalViewSizeProperty 屬性變更
無對應項目 VerticalViewSizeProperty 屬性變更
無對應項目 ToggleStateProperty 屬性變更
無對應項目 WindowVisualStateProperty 屬性變更
無對應項目 AsyncContentLoadedEvent DocumentCompleted 事件
無對應項目 ToolTipOpenedEvent

安全

某些 IAccessible 自定義案例需要封裝基底 IAccessible 並進行調用。 這具有安全性影響,因為部分信任的元件不應該是程式代碼路徑上的媒介。

使用者介面自動化模型能消除提供者呼叫其他提供者程式碼的需求。 使用者介面自動化核心服務會執行所有必要的匯總。

另請參閱