共用方式為


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 類別,利用任何篩選過的樹狀檢視從任何起點開始巡覽。 您也可以使用 FindFirstFindAll 巡覽至特定子項或子代,例如,要擷取對話方塊中支援指定控制項模式的所有項目,是相當容易的。

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 中的狀態。 有些屬性是所有項目通用的,但其他則專屬於控制項型別和控制項模式。 屬性是使用唯一識別項區分,大多數屬性都可以使用單一方法、GetCurrentPropertyValueGetCachedPropertyValue 擷取。 許多屬性也可以很容易從 CurrentCached 屬性存取子擷取。

UI 自動化提供者毋需實作不相關的屬性,針對任何不支援的屬性可以只傳回 null 值。 此外,UI Automation核心服務也可以從預設視窗提供者取得部分屬性,這些屬性已與提供者明確實作的屬性合併。

在支援更多屬性的情況下,UI Automation可使用單一跨處理序呼叫擷取多個屬性,藉此提升效能。

下表顯示兩種模型的屬性之間的對應關係。

Active Accessibility 屬性存取子

UI Automation屬性 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 Automation不支援此項

accDescription 在 MSAA 沒有明確的規格,因此提供者可在這個屬性放入不同的資訊。

get_accHelpTopic

UI Automation不支援此項

下表顯示哪些 UI Automation屬性與 Active Accessibility 狀態常數對應。

Active Accessibility 狀態

UI Automation屬性

會觸發狀態變更嗎?

STATE_SYSTEM_CHECKED

若為核取方塊,則為 ToggleStateProperty

若為選項按鈕,則為 IsSelectedProperty

Y

STATE_SYSTEM_COLLAPSED

ExpandCollapseState = Collapsed

Y

STATE_SYSTEM_EXPANDED

ExpandCollapseState = ExpandedPartiallyExpanded

Y

STATE_SYSTEM_FOCUSABLE

IsKeyboardFocusableProperty

N

STATE_SYSTEM_FOCUSED

HasKeyboardFocusProperty

N

STATE_SYSTEM_HASPOPUP

功能表項目則為 ExpandCollapsePattern

N

STATE_SYSTEM_INVISIBLE

IsOffscreenProperty = True 且 GetClickablePoint 引發 NoClickablePointException

N

STATE_SYSTEM_LINKED

ControlTypeProperty =

Hyperlink

N

STATE_SYSTEM_MIXED

ToggleState = Indeterminate

N

STATE_SYSTEM_MOVEABLE

CanMoveProperty

N

STATE_SYSTEM_MUTLISELECTABLE

CanSelectMultipleProperty

N

STATE_SYSTEM_OFFSCREEN

IsOffscreenProperty = True

N

STATE_SYSTEM_PROTECTED

IsPasswordProperty

N

STATE_SYSTEM_READONLY

RangeValuePattern.IsReadOnlyPropertyValuePattern.IsReadOnlyProperty

N

STATE_SYSTEM_SELECTABLE

支援 SelectionItemPattern

N

STATE_SYSTEM_SELECTED

IsSelectedProperty

N

STATE_SYSTEM_SIZEABLE

CanResize

N

STATE_SYSTEM_UNAVAILABLE

IsEnabledProperty

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

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 Automation沒有定義直接對應的事件。

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 Automation模型則可讓提供者不需要間接呼叫其他提供者程式碼。 UI Automation核心服務會負責所有必要的彙總作業。

請參閱

其他資源

UI 自動化基礎觀念