UI 自動化和 Microsoft Active Accessibility
![]() |
---|
這份文件適用於想要使用 System.Windows.Automation 命名空間中定義之 Managed UI Automation 類別的 .NET Framework 開發人員。如需 UI Automation 的最新資訊,請參閱 Windows Automation API:使用者介面自動化 (英文)。 |
Microsoft Active Accessibility 是過去用來讓應用程式成為可存取的方法。 Microsoft UI Automation則是 Microsoft Windows 的新存取模型,能滿足輔助科技產品及自動化測試工具的需求。 UI Automation提供許多優於 Active Accessibility 的改進功能。
本主題涵蓋 UI Automation的主要功能,並說明這些功能與 Active Accessibility 的不同之處。
這個主題包含下列章節。
- 程式語言
- Windows Presentation Foundation 的支援
- 伺服器和用戶端
- UI 項目
- 樹狀檢視和巡覽
- 角色和控制項型別
- 狀態和屬性
- 事件
- 安全性
- 相關主題
程式語言
Active Accessibility 是以Component Object Model (COM) 為基礎,支援雙重介面,因此可在 C/C++、Microsoft Visual Basic 6.0 和指令碼語言中程式化。 UI Automation (包含標準控制項的用戶端提供者程式庫) 是以 Managed 程式碼撰寫的,因此 UI 自動化用戶端應用程式最容易使用 Microsoft Visual C# 或 Microsoft Visual Basic .NET 進行程式設計。 UI 自動化提供者是介面實作,可使用 Managed 程式碼或 C/C++ 撰寫。
Windows Presentation Foundation 的支援
Windows Presentation Foundation (WPF) 建立使用者介面的新類型。 WPF 項目未提供 Active Accessibility 的原生支援,不過,這些項目支援 UI Automation,包括 Active Accessibility 用戶端的橋接支援。 只有專為 UI Automation撰寫的用戶端才能完整利用 WPF 的存取功能,例如強大的文字支援。
伺服器和用戶端
在 Active Accessibility 中,伺服器與用戶端會直接通訊,大部分是透過伺服器的 IAccessible 實作。
在 UI Automation中,伺服器與用戶端之間則有稱為提供者的核心服務。 核心服務會呼叫提供者實作的介面,並提供其他服務,例如為項目產生唯一執行階段識別項。 用戶端應用程式則使用程式庫函式呼叫 UI Automation服務。
UI 自動化提供者可提供資訊給 Active Accessibility 用戶端,Active Accessibility 伺服器也可以提供資訊給 UI 自動化用戶端應用程式。 不過,由於 Active Accessibility 公開的資訊沒有 UI Automation多,因此兩個模型並非完全相容。
UI 項目
Active Accessibility 會將 UI 項目呈現為 IAccessible 介面或子識別項。 但要比較兩個 IAccessible 指標,來判斷它們是否指向相同的項目,並不是很容易。
在 UI Automation中,每個項目都以 AutomationElement 物件表示。 這就可以使用等號比較運算子或 Equals 方法進行比較,這兩者都會比較項目的唯一執行階段識別項。
樹狀檢視和巡覽
螢幕上的user interface (UI) 項目可視為樹狀結構,將桌面當做根部、應用程式視窗為直接子系,而應用程式內的項目為更下層的子代。
在 Active Accessibility 中,許多與使用者無關的自動化項目也會公開在樹狀結構中。 用戶端應用程式必須查看所有項目,才能判斷哪些是有意義的。
UI 自動化用戶端應用程式則會透過篩選過的檢視看到 UI。 檢視中只有需要的項目,也就是提供資訊給使用者或可供互動的項目。 預先定義的檢視包括只有控制項項目和只有內容項目的檢視,此外,應用程式也可以定義自訂檢視。 UI Automation可簡化向使用者描述 UI 的工作,也可協助使用者與應用程式互動。
在 Active Accessibility 中巡覽項目的方式有空間巡覽 (例如,移至螢幕左方的項目)、邏輯巡覽 (例如,移至下一個功能表項目,或對話方塊內定位順序的下一個項目),或階層巡覽 (例如,移動容器中的第一個子項,或從子項移至父項)。 階層巡覽很複雜,因為子項目不一定都是實作 IAccessible 的物件。
在 UI Automation中,所有 UI 項目都是 AutomationElement 物件,能支援相同的基本功能 (從提供者的角度來看,這些是實作繼承自 IRawElementProviderSimple 之介面的物件)。巡覽主要是採取階層方式:從父項到子項,以及在同層級項目之間巡覽 (同層級之間的巡覽有邏輯項目,因為這可能會依照定位順序巡覽)。您可以使用 TreeWalker 類別,利用任何篩選過的樹狀檢視從任何起點開始巡覽。 您也可以使用 FindFirst 和 FindAll 巡覽至特定子項或子代,例如,要擷取對話方塊中支援指定控制項模式的所有項目,是相當容易的。
UI Automation的巡覽比 Active Accessibility 的巡覽更一致。 部分像下拉式清單和快顯視窗的項目會在 Active Accessibility 樹狀目錄出現兩次,而從這些項目巡覽可能會發生非預期的結果。 實際上並無法針對 Rebar 控制項正確實作 Active Accessibility。 UI Automation則可重新設定父代和位置,使項目可置於樹狀目錄中的任何位置 (無論受到視窗擁有權影響的階層為何)。
角色和控制項型別
Active Accessibility 使用 accRole 屬性 (IAccessible::get_actRole) 擷取 UI 中的項目角色描述,例如 ROLE_SYSTEM_SLIDER 或 ROLE_SYSTEM_MENUITEM。 項目的角色是其可用功能的主要提示。 與控制項的互動是使用固定方法 (例如 IAccessible::accSelect 和 IAccessible::accDoDefaultAction) 進行的。 用戶端應用程式與 UI 之間的互動則限於可以透過 IAccessible 進行的互動。
相反地,UI Automation基本上會將項目的控制項型別 (由 ControlType 屬性描述) 與其應有的功能分開。 功能是由提供者透過其實作特殊化介面支援的控制項模式所決定。 控制項模式可以結合在一起,以描述特定 UI 項目所支援的完整功能集合。 部分提供者必須支援特定控制項模式,例如,核取方塊的提供者就必須支援 Toggle 控制項模式。 有些提供者則必須支援一或多種控制項模式,例如,按鈕必須支援 Toggle 或 Invoke。 另外也有提供者完全不支援控制項模式,例如,若窗格無法移動、調整大小或停駐,就沒有任何控制項模式。
UI Automation支援自訂控制項,這是由 Custom 屬性識別並可由 LocalizedControlTypeProperty 屬性描述。
下表顯示 Active Accessibility 角色與 UI Automation控制項型別之間的對應關係。
Active Accessibility 角色 |
UI Automation控制項型別 |
---|---|
ROLE_SYSTEM_PUSHBUTTON |
Button |
ROLE_SYSTEM_CLIENT |
Calendar |
ROLE_SYSTEM_CHECKBUTTON |
Check box |
ROLE_SYSTEM_COMBOBOX |
Combo box |
ROLE_SYSTEM_CLIENT |
Custom |
ROLE_SYSTEM_LIST |
Data grid |
ROLE_SYSTEM_LISTITEM |
Data item |
ROLE_SYSTEM_DOCUMENT |
Document |
ROLE_SYSTEM_TEXT |
Edit |
ROLE_SYSTEM_GROUPING |
Group |
ROLE_SYSTEM_LIST |
Header |
ROLE_SYSTEM_COLUMNHEADER |
Header item |
ROLE_SYSTEM_LINK |
Hyperlink |
ROLE_SYSTEM_GRAPHIC |
Image |
ROLE_SYSTEM_LIST |
List |
ROLE_SYSTEM_LISTITEM |
List item |
ROLE_SYSTEM_MENUPOPUP |
Menu |
ROLE_SYSTEM_MENUBAR |
Menu bar |
ROLE_SYSTEM_MENUITEM |
Menu item |
ROLE_SYSTEM_PANE |
Pane |
ROLE_SYSTEM_PROGRESSBAR |
Progress bar |
ROLE_SYSTEM_RADIOBUTTON |
Radio button |
ROLE_SYSTEM_SCROLLBAR |
Scroll bar |
ROLE_SYSTEM_SEPARATOR |
Separator |
ROLE_SYSTEM_SLIDER |
Slider |
ROLE_SYSTEM_SPINBUTTON |
Spinner |
ROLE_SYSTEM_SPLITBUTTON |
Split button |
ROLE_SYSTEM_STATUSBAR |
Status bar |
ROLE_SYSTEM_PAGETABLIST |
Tab |
ROLE_SYSTEM_PAGETAB |
Tab item |
ROLE_SYSTEM_TABLE |
Table |
ROLE_SYSTEM_STATICTEXT |
Text |
ROLE_SYSTEM_INDICATOR |
Thumb |
ROLE_SYSTEM_TITLEBAR |
Title bar |
ROLE_SYSTEM_TOOLBAR |
Tool bar |
ROLE_SYSTEM_TOOLTIP |
ToolTip |
ROLE_SYSTEM_OUTLINE |
Tree |
ROLE_SYSTEM_OUTLINEITEM |
Tree item |
ROLE_SYSTEM_WINDOW |
Window |
如需不同控制項型別的詳細資訊,請參閱 UI 自動化控制項型別。
狀態和屬性
在 Active Accessibility 中,項目支援一組通用的屬性,並根據項目的角色而定,支援一些必須描述內容差異極大的屬性 (例如 accState)。 伺服器必須實作 IAccessible 所有傳回屬性的方法,不論是否與項目相關。
UI Automation則定義更多屬性,其中部分相當於 Active Accessibility 中的狀態。 有些屬性是所有項目通用的,但其他則專屬於控制項型別和控制項模式。 屬性是使用唯一識別項區分,大多數屬性都可以使用單一方法、GetCurrentPropertyValue 或 GetCachedPropertyValue 擷取。 許多屬性也可以很容易從 Current 和 Cached 屬性存取子擷取。
UI 自動化提供者毋需實作不相關的屬性,針對任何不支援的屬性可以只傳回 null 值。 此外,UI Automation核心服務也可以從預設視窗提供者取得部分屬性,這些屬性已與提供者明確實作的屬性合併。
在支援更多屬性的情況下,UI Automation可使用單一跨處理序呼叫擷取多個屬性,藉此提升效能。
下表顯示兩種模型的屬性之間的對應關係。
Active Accessibility 屬性存取子 |
UI Automation屬性 ID |
備註 |
---|---|---|
get_accKeyboardShortcut |
如果兩者都有,AccessKeyProperty 會取得優先權。 |
|
get_accName |
|
|
get_accRole |
請參閱上表,了解角色與控制項型別的對應關係。 |
|
get_accValue |
只對支援 ValuePattern 或 RangeValuePattern 的控制項型別有效。 RangeValue 值會標準化為 0-100,以與 MSAA 行為一致。 值項目使用字串。 |
|
get_accHelp |
||
accLocation |
||
get_accDescription |
UI Automation不支援此項 |
accDescription 在 MSAA 沒有明確的規格,因此提供者可在這個屬性放入不同的資訊。 |
get_accHelpTopic |
UI Automation不支援此項 |
下表顯示哪些 UI Automation屬性與 Active Accessibility 狀態常數對應。
Active Accessibility 狀態 |
UI Automation屬性 |
會觸發狀態變更嗎? |
---|---|---|
STATE_SYSTEM_CHECKED |
若為核取方塊,則為 ToggleStateProperty 若為選項按鈕,則為 IsSelectedProperty |
Y |
STATE_SYSTEM_COLLAPSED |
Y |
|
STATE_SYSTEM_EXPANDED |
Y |
|
STATE_SYSTEM_FOCUSABLE |
N |
|
STATE_SYSTEM_FOCUSED |
N |
|
STATE_SYSTEM_HASPOPUP |
功能表項目則為 ExpandCollapsePattern |
N |
STATE_SYSTEM_INVISIBLE |
IsOffscreenProperty = True 且 GetClickablePoint 引發 NoClickablePointException |
N |
STATE_SYSTEM_LINKED |
N |
|
STATE_SYSTEM_MIXED |
N |
|
STATE_SYSTEM_MOVEABLE |
N |
|
STATE_SYSTEM_MUTLISELECTABLE |
N |
|
STATE_SYSTEM_OFFSCREEN |
IsOffscreenProperty = True |
N |
STATE_SYSTEM_PROTECTED |
N |
|
STATE_SYSTEM_READONLY |
RangeValuePattern.IsReadOnlyProperty 和 ValuePattern.IsReadOnlyProperty |
N |
STATE_SYSTEM_SELECTABLE |
N |
|
STATE_SYSTEM_SELECTED |
N |
|
STATE_SYSTEM_SIZEABLE |
N |
|
STATE_SYSTEM_UNAVAILABLE |
Y |
以下是大多數 Active Accessibility 控制項伺服器不實作或在 UI Automation沒有對等用法的狀態。
Active Accessibility 狀態 |
備註 |
---|---|
STATE_SYSTEM_BUSY |
在 UI Automation中無法使用 |
STATE_SYSTEM_DEFAULT |
在 UI Automation中無法使用 |
STATE_SYSTEM_ANIMATED |
在 UI Automation中無法使用 |
STATE_SYSTEM_EXTSELECTABLE |
Active Accessibility 伺服器未廣泛實作 |
STATE_SYSTEM_MARQUEED |
Active Accessibility 伺服器未廣泛實作 |
STATE_SYSTEM_SELFVOICING |
Active Accessibility 伺服器未廣泛實作 |
STATE_SYSTEM_TRAVERSED |
在 UI Automation中無法使用 |
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 Automation中無法使用 |
STATE_SYSTEM_PRESSED |
在 UI Automation中無法使用 |
如需 UI Automation屬性識別項的完整清單,請參閱 UI 自動化屬性概觀。
事件
UI Automation的事件機制不像 Active Accessibility,並不是使用 Windows 事件路由 (與視窗控制代碼緊密相關),因此用戶端應用程式無須設定攔截程序。 事件訂閱不僅可以微調特定事件,還可以微調樹狀目錄的特定部分。 提供者也可以藉由追蹤接聽的事件,微調事件的引發。
用戶端也很容易擷取引發事件的項目,因為這些會直接傳遞到事件回呼。 當用戶端訂閱事件時,若有快取要求作用中,項目的屬性會自動預先擷取。
下表顯示 Active Accessibility WinEvent 與 UI Automation事件之間的對應關係。
WinEvent |
UI Automation事件識別項 |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE |
|
EVENT_OBJECT_CONTENTSCROLLED |
VerticalScrollPercentProperty 或 HorizontalScrollPercentProperty 屬性在相關聯的捲軸上變更 |
EVENT_OBJECT_CREATE |
|
EVENT_OBJECT_DEFACTIONCHANGE |
沒有對等用法 |
EVENT_OBJECT_DESCRIPTIONCHANGE |
沒有直接對等用法;可能是 HelpTextProperty 或 LocalizedControlTypeProperty 屬性變更 |
EVENT_OBJECT_DESTROY |
|
EVENT_OBJECT_FOCUS |
|
EVENT_OBJECT_HELPCHANGE |
|
EVENT_OBJECT_HIDE |
|
EVENT_OBJECT_LOCATIONCHANGE |
|
EVENT_OBJECT_NAMECHANGE |
NameProperty 屬性變更 |
EVENT_OBJECT_PARENTCHANGE |
|
EVENT_OBJECT_REORDER |
Active Accessibility 的用法不一致。 UI Automation沒有定義直接對應的事件。 |
EVENT_OBJECT_SELECTION |
|
EVENT_OBJECT_SELECTIONADD |
|
EVENT_OBJECT_SELECTIONREMOVE |
|
EVENT_OBJECT_SELECTIONWITHIN |
沒有對等用法 |
EVENT_OBJECT_SHOW |
|
EVENT_OBJECT_STATECHANGE |
多種屬性變更事件 |
EVENT_OBJECT_VALUECHANGE |
RangeValuePattern.ValueProperty 和 ValuePattern.ValueProperty 變更 |
EVENT_SYSTEM_ALERT |
沒有對等用法 |
EVENT_SYSTEM_CAPTUREEND |
沒有對等用法 |
EVENT_SYSTEM_CAPTURESTART |
沒有對等用法 |
EVENT_SYSTEM_CONTEXTHELPEND |
沒有對等用法 |
EVENT_SYSTEM_CONTEXTHELPSTART |
沒有對等用法 |
EVENT_SYSTEM_DIALOGEND |
|
EVENT_SYSTEM_DIALOGSTART |
|
EVENT_SYSTEM_DRAGDROPEND |
沒有對等用法 |
EVENT_SYSTEM_DRAGDROPSTART |
沒有對等用法 |
EVENT_SYSTEM_FOREGROUND |
|
EVENT_SYSTEM_MENUEND |
|
EVENT_SYSTEM_MENUPOPUPEND |
|
EVENT_SYSTEM_MENUPOPUPSTART |
|
EVENT_SYSTEM_MENUSTART |
|
EVENT_SYSTEM_MINIMIZEEND |
|
EVENT_SYSTEM_MINIMIZESTART |
|
EVENT_SYSTEM_MOVESIZEEND |
|
EVENT_SYSTEM_MOVESIZESTART |
|
EVENT_SYSTEM_SCROLLINGEND |
VerticalScrollPercentProperty 或 HorizontalScrollPercentProperty 屬性變更 |
EVENT_SYSTEM_SCROLLINGSTART |
VerticalScrollPercentProperty 或 HorizontalScrollPercentProperty 屬性變更 |
EVENT_SYSTEM_SOUND |
沒有對等用法 |
EVENT_SYSTEM_SWITCHEND |
沒有對等用法,但 AutomationFocusChangedEvent 事件會發出新應用程式已接收焦點的信號 |
EVENT_SYSTEM_SWITCHSTART |
沒有對等用法 |
沒有對等用法 |
CurrentViewProperty 屬性變更 |
沒有對等用法 |
|
沒有對等用法 |
|
沒有對等用法 |
|
沒有對等用法 |
|
沒有對等用法 |
|
沒有對等用法 |
|
沒有對等用法 |
ToggleStateProperty 屬性變更 |
沒有對等用法 |
|
沒有對等用法 |
|
沒有對等用法 |
安全性
部分 IAccessible 自訂作業需要包裝基底 IAccessible 並需要間接呼叫它。 這是基於安全考量,因為部分受信任元件不應成為程式碼路徑上的媒介。
UI Automation模型則可讓提供者不需要間接呼叫其他提供者程式碼。 UI Automation核心服務會負責所有必要的彙總作業。