備註
本檔適用於想要使用 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 類別,從樹狀結構的任何篩選檢視開始,從任何起點進行導航。 您也可以使用 FindFirst 和 FindAll 來巡覽至特定的子代或後代。例如,在支援指定控制項模式的對話方塊中很容易擷取所有元素。
在 UI 自動化中,導航比在 Microsoft Active Accessibility 中更一致。 某些元素,例如下拉式清單和彈出視窗會在「Active Accessibility」樹狀結構中出現兩次,而從中瀏覽可能會有非預期的結果。 實際上無法正確地為 Rebar 控制項實作「主動式協助功能」。 使用者介面自動化可啟用重新指定父代和重新安置,因此元素可以放置在樹狀結構中的任何位置,儘管窗口擁有權施加的階層限制。
角色和控制項類型
中輔助功能使用accRole屬性(IAccessible::get_actRole)來擷取UI中元素角色的描述,例如ROLE_SYSTEM_SLIDER或ROLE_SYSTEM_MENUITEM。 從項目的角色可以了解他所能使用的功能。 使用固定方法如 IAccessible::accSelect 和 IAccessible::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 的狀態。 有些是所有元素的通用特性,但有些則是特定控制類型和控制模式的專屬特性。 屬性會以唯一標識符區分,而且大部分的屬性都可以使用單一方法 GetCurrentPropertyValue 或 GetCachedPropertyValue來擷取。 許多屬性也可以輕鬆地從 Current 和 Cached 屬性存取子擷取。
使用者介面自動化提供者不需要實作不相關的屬性,但只要傳回 null 它不支援的任何屬性的值即可。 此外,使用者介面自動化核心服務可以從默認視窗提供者取得一些屬性,而這些屬性會與提供者明確實作的屬性合併。
除了支援更多屬性,使用者介面自動化也藉由允許使用單一跨進程呼叫來擷取多個屬性,以提供更佳的效能。
下表顯示兩個模型中屬性之間的對應。
| Active Accessibility 屬性存取子 | UI 自動化屬性 ID | 備註 |
|---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty 或 AcceleratorKeyProperty |
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 = Expanded 或 PartiallyExpanded | 是 |
| 可聚焦系統狀態 | 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.IsReadOnlyProperty 和 ValuePattern.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 | VerticalScrollPercentProperty 或 HorizontalScrollPercentProperty 的相關聯滾動條上屬性變更 |
| 事件_物件_創建 | StructureChangedEvent |
| EVENT_OBJECT_DEFACTIONCHANGE | 無對應項目 |
| EVENT_OBJECT_DESCRIPTIONCHANGE(說明變更) | 沒有確切的對等項目;或許 HelpTextProperty 或 LocalizedControlTypeProperty 屬性變更 |
| 物件銷毀事件 | 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.ValueProperty 和 ValuePattern.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 | VerticalScrollPercentProperty 或 HorizontalScrollPercentProperty 屬性變更 |
| 滾動開始事件 | VerticalScrollPercentProperty 或 HorizontalScrollPercentProperty 屬性變更 |
| 系統事件_聲音 | 無對應項目 |
| EVENT_SYSTEM_SWITCHEND | 雖然沒有相對應的內容,但 AutomationFocusChangedEvent 事件顯示新應用程式已獲得焦點 |
| 系統事件_切換開始(EVENT_SYSTEM_SWITCHSTART) | 無對應項目 |
| 無對應項目 | CurrentViewProperty 屬性變更 |
| 無對應項目 | HorizontallyScrollableProperty 屬性變更 |
| 無對應項目 | VerticallyScrollableProperty 屬性變更 |
| 無對應項目 | HorizontalScrollPercentProperty 屬性變更 |
| 無對應項目 | VerticalScrollPercentProperty 屬性變更 |
| 無對應項目 | HorizontalViewSizeProperty 屬性變更 |
| 無對應項目 | VerticalViewSizeProperty 屬性變更 |
| 無對應項目 | ToggleStateProperty 屬性變更 |
| 無對應項目 | WindowVisualStateProperty 屬性變更 |
| 無對應項目 | AsyncContentLoadedEvent DocumentCompleted 事件 |
| 無對應項目 | ToolTipOpenedEvent |
安全
某些 IAccessible 自定義案例需要封裝基底 IAccessible 並進行調用。 這具有安全性影響,因為部分信任的元件不應該是程式代碼路徑上的媒介。
使用者介面自動化模型能消除提供者呼叫其他提供者程式碼的需求。 使用者介面自動化核心服務會執行所有必要的匯總。