共用方式為


UI 自動化和 Microsoft Active Accessibility

注意

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

Microsoft Active Accessibility 是過去用來讓應用程式成為可存取的方法。 Microsoft UI 自動化是 Microsoft Windows 的一種新的協助工具模型,能滿足輔助科技產品及自動化測試工具的需求。 UI 自動化提供許多超越 Active Accessibility 的改善。

本主題包含 UI 自動化的主要功能,並解釋這些功能與 Active Accessibility 的差異。

程式語言:

Active Accessibility 是以元件物件模型 (COM) 為基礎,支援雙重介面,因此可用 C/C++、Microsoft Visual Basic 6.0 和指令碼語言進行程式設計。 UI 自動化 (包含適用於標準控制碼的用戶端提供者程式庫) 是以受控程式碼所撰寫,而且使用 C# 或 Visual Basic .NET 進行 UI 自動化用戶端應用程式的程式設計最為輕鬆。 使用 Managed 程式碼或 C/C++ 皆可撰寫使用者介面自動化提供者,亦即介面實作。

Windows Presentation Foundation 的支援

Windows Presentation Foundation (WPF) 是用於建立使用者介面的新模型。 WPF 元素不包含 Active Accessibility 的原生支援;不過,這些元素確實支援 UI 自動化,其中包括對 Active Accessibility 用戶端的橋接支援。 只有特別為 UI 自動化撰寫的用戶端可完整利用 WPF 的協助工具功能,例如豐富的文字支援。

Servers 與 Clients

在 Active Accessibility 中,伺服器與用戶端主要透過伺服器的 IAccessible 實作來直接通訊。

在 UI 自動化中,有核心服務位於伺服器 (稱為提供者) 與用戶端之間。 此核心服務會呼叫提供者所實作的介面,並提供額外服務,例如為項目產生唯一的執行階段識別碼。 用戶端應用程式會使用程式庫函式呼叫 UI 自動化服務。

UI 自動化提供者可以將資訊提供給 Active Accessibility 用戶端,而 Active Accessibility 伺服器可以將資訊提供給 UI 自動化應用程式。 然而,因為 Active Accessibility 公開的資訊量不及 UI 自動化,所以這兩個模型並不完全相容。

UI 項目

Active Accessibility 會將 UI 元素呈現為 IAccessible 介面或子識別碼。 因此我們很難藉由比較兩者的 IAccessible 指標,來判斷它們是否參考同一個項目。

在 UI 自動化中,每個元素都會呈現為 AutomationElement 物件。 所以只要使用等號比較運算子或 Equals 方法就能進行比較。這兩個方法都會比較項目的唯一執行階段識別碼。

樹狀檢視和導覽

畫面上的使用者介面 (UI) 元素可看成以桌面為根、應用程式視窗為下層子項目,以及應用程式內元素為後續子系的樹狀結構。

在 Active Accessibility 中,許多與終端使用者無關的自動化元素都會公開於樹狀結構中。 用戶端應用程式必須先全盤查看,才能判斷出重要的項目。

UI 自動化用戶端應用程式會透過篩選的檢視來查看 UI。 此檢視只包含所需項目,也就是可提供資訊給使用者或可互動的項目。 使用者可查看只包含控制項目和只包含內容項目的預先定義檢視;此外,應用程式可以定義自訂檢視。 UI 自動化簡化了向使用者描述 UI 及協助使用者與應用程式互動的工作。

在 Active Accessibility 中,於元素間的導覽方式可以是空間式 (例如移至位於畫面左側的項目)、邏輯式 (例如移至下一個功能表項目,或對話方塊內依索引標籤排序的下一個項目) 或階層式 (例如移至容器中第一個子系,或從子系移至其父系)。 階層式導覽相當複雜,因為事實上子項目不一定是實作 IAccessible的物件。

在 UI 自動化中,所有 UI 元素都是支援相同基本功能的 AutomationElement。 (從提供者角度來看,這些是實作繼承自 IRawElementProviderSimple 之介面的物件。)導覽主要為階層式:從父系到子系,以及同層級之間。 (在同層級間的導覽帶有邏輯項目,因為可能會遵循索引標籤順序。)您只要使用 TreeWalker 類別,就能透過任何已篩選的樹狀檢閱,由任一起點進行導覽。 您也可以使用 FindFirstFindAll導覽到特定子系;例如,您可以非常輕易地截取支援特定控制項模式的對話方塊內所有項目。

UI 自動化中的導覽比 Active Accessibility 更一致。 下拉式清單及彈出視窗等部分元素會在 Active Accessibility 樹狀結構中出現兩次,從這類項目進行導覽也可能會產生意外的結果。 事實上,要為 Rebar 控制項正確實作 Active Accessibility 是不可能的。 UI 自動化允許重設父代及重新調整位置,因此儘管視窗擁有權強加了階層,元素仍可放置在樹狀結構中的任何位置。

角色和控制項類型

Active Accessibility 會使用 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_PUSHBUTTON Button
ROLE_SYSTEM_CLIENT Calendar
ROLE_SYSTEM_CHECKBUTTON 核取方塊
ROLE_SYSTEM_COMBOBOX 組合方塊
ROLE_SYSTEM_CLIENT 自訂
ROLE_SYSTEM_LIST 資料格
ROLE_SYSTEM_LISTITEM 資料項目
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_LISTITEM 清單項目
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_SPINBUTTON 微調按鈕
ROLE_SYSTEM_SPLITBUTTON 分割按鈕
ROLE_SYSTEM_STATUSBAR 狀態列
ROLE_SYSTEM_PAGETABLIST 定位字元
ROLE_SYSTEM_PAGETAB 索引標籤項目
ROLE_SYSTEM_TABLE Table
ROLE_SYSTEM_STATICTEXT Text
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_TITLEBAR 標題列
ROLE_SYSTEM_TOOLBAR 工具列
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE 樹狀結構
ROLE_SYSTEM_OUTLINEITEM 樹狀結構項目
ROLE_SYSTEM_WINDOW Window

如需其他控制項類型的詳細資訊,請參閱 UI Automation Control Types

狀態和屬性

在 Active Accessibility 中,元素會支援一組常見屬性。然而,根據元素角色的不同,某些屬性必須用來描述非常不同的事物 (例如 accState)。 伺服器必須實作所有會傳回屬性的 IAccessible 方法,即使方法與項目無關亦然。

UI 自動化定義了更多屬性,其中某些對應到 Active Accessibility 中的狀態。 有些屬性對所有項目而言都很常見,其他則專屬控制項類型和控制項模式。 屬性是透過唯一識別碼來區別,而且大部分屬性可使用單一方法、 GetCurrentPropertyValueGetCachedPropertyValue加以擷取。 許多屬性也可從 CurrentCached 屬性存取子輕鬆擷取。

使用者介面自動化提供者無須實作不相關的屬性,只要針對不支援的所有屬性傳回 null 值即可。 此外,UI 自動化核心服務可以從預設視窗提供者取得一些屬性,而這些屬性會與提供者明確實作的屬性合併。

UI 自動化不僅支援更多屬性,同時透過允許單一跨程序呼叫擷取多個屬性,提供更佳效能。

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

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 自動化屬性 觸發狀態是否變更?
STATE_SYSTEM_CHECKED 若是核取方塊,為 ToggleStateProperty

若是選項按鈕,為 IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = ExpandedPartiallyExpanded Y
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty
STATE_SYSTEM_HASPOPUP 若是功能表項目,為ExpandCollapsePattern
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = True 且 GetClickablePoint 導致 NoClickablePointException
STATE_SYSTEM_LINKED ControlTypeProperty =

Hyperlink
STATE_SYSTEM_MIXED ToggleState = Indeterminate
STATE_SYSTEM_MOVEABLE CanMoveProperty
STATE_SYSTEM_MUTLISELECTABLE CanSelectMultipleProperty
STATE_SYSTEM_OFFSCREEN IsOffscreenProperty = True
STATE_SYSTEM_PROTECTED IsPasswordProperty
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyPropertyValuePattern.IsReadOnlyProperty
STATE_SYSTEM_SELECTABLE 支援SelectionItemPattern
STATE_SYSTEM_SELECTED IsSelectedProperty
STATE_SYSTEM_SIZEABLE CanResize
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

下列狀態未由大多數 Active Accessibility 控制伺服器實作,或在 UI 自動化中沒有對等狀態。

Active Accessibility 狀態 備註
STATE_SYSTEM_BUSY UI 自動化中無法使用
STATE_SYSTEM_DEFAULT UI 自動化中無法使用
STATE_SYSTEM_ANIMATED UI 自動化中無法使用
STATE_SYSTEM_EXTSELECTABLE Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_MARQUEED Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_SELFVOICING Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_TRAVERSED UI 自動化中無法使用
STATE_SYSTEM_ALERT_HIGH Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_ALERT_MEDIUM Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_ALERT_LOW Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_FLOATING Active Accessibility 伺服器未廣泛實作
STATE_SYSTEM_HOTTRACKED UI 自動化中無法使用
STATE_SYSTEM_PRESSED UI 自動化中無法使用

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

事件

UI 自動化中的事件機制不同於 Active Accessibility中的機制,其不依賴 Windows 事件路由 (與視窗控制代碼緊密繫結),也不要求用戶端應用程式設定掛勾。 事件訂閱不僅可微調到特定事件,也可以微調到特定的樹狀組件。 提供者也可以持續注意哪些事件正被接聽,藉此微調事件引發。

引發事件的項目會直接傳遞到事件回呼,因此用戶端更容易加以擷取。 如果用戶端訂閱事件時,快取要求正在作用,則會自動預先擷取項目的屬性。

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

WinEvent UI 自動化事件識別碼
EVENT_OBJECT_ACCELERATORCHANGE AcceleratorKeyProperty 屬性變更
EVENT_OBJECT_CONTENTSCROLLED 相關聯捲軸上的VerticalScrollPercentPropertyHorizontalScrollPercentProperty 屬性變更。
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE 沒有對等項目
EVENT_OBJECT_DESCRIPTIONCHANGE 沒有對等項目;可能有 HelpTextPropertyLocalizedControlTypeProperty 屬性變更
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty 變更
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE BoundingRectangleProperty 屬性變更
EVENT_OBJECT_NAMECHANGE NameProperty 屬性變更
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER 未一致地用於 Active Accessibility 中。 沒有任何直接對應的事件定義在 UI 自動化中。
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN 沒有對等項目
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE 多項屬性變更事件
EVENT_OBJECT_VALUECHANGE RangeValuePattern.ValuePropertyValuePattern.ValueProperty 已變更
EVENT_SYSTEM_ALERT 沒有對等項目
EVENT_SYSTEM_CAPTUREEND 沒有對等項目
EVENT_SYSTEM_CAPTURESTART 沒有對等項目
EVENT_SYSTEM_CONTEXTHELPEND 沒有對等項目
EVENT_SYSTEM_CONTEXTHELPSTART 沒有對等項目
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND 沒有對等項目
EVENT_SYSTEM_DRAGDROPSTART 沒有對等項目
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND WindowVisualStateProperty 屬性變更
EVENT_SYSTEM_MINIMIZESTART WindowVisualStateProperty 屬性變更
EVENT_SYSTEM_MOVESIZEEND BoundingRectangleProperty 屬性變更
EVENT_SYSTEM_MOVESIZESTART BoundingRectangleProperty 屬性變更
EVENT_SYSTEM_SCROLLINGEND VerticalScrollPercentPropertyHorizontalScrollPercentProperty 屬性變更
EVENT_SYSTEM_SCROLLINGSTART VerticalScrollPercentPropertyHorizontalScrollPercentProperty 屬性變更
EVENT_SYSTEM_SOUND 沒有對等項目
EVENT_SYSTEM_SWITCHEND 沒有對等項目,但有新應用程式已收到焦點的 AutomationFocusChangedEvent 事件訊號。
EVENT_SYSTEM_SWITCHSTART 沒有對等項目
沒有對等項目 CurrentViewProperty 屬性變更
沒有對等項目 HorizontallyScrollableProperty 屬性變更
沒有對等項目 VerticallyScrollableProperty 屬性變更
沒有對等項目 HorizontalScrollPercentProperty 屬性變更
沒有對等項目 VerticalScrollPercentProperty 屬性變更
沒有對等項目 HorizontalViewSizeProperty 屬性變更
沒有對等項目 VerticalViewSizeProperty 屬性變更
沒有對等項目 ToggleStateProperty 屬性變更
沒有對等項目 WindowVisualStateProperty 屬性變更
沒有對等項目 AsyncContentLoadedEvent 事件
沒有對等項目 ToolTipOpenedEvent

安全性

某些 IAccessible 自訂化情節需要包裝基底 IAccessible 並加以呼叫。 這會有安全性顧慮,因為程式碼路徑的媒介不應該是部分受信任的元件。

UI 自動化模型可讓提供者無須呼叫其他提供者程式碼。 UI 自動化核心服務會執行所有必要彙總。

另請參閱