UI オートメーションとアクティブなアクセシビリティ

Microsoft Active Accessibility は、Windows 95 で導入され、Windows アプリケーションにアクセスできるように設計されたレガシ API です。 Microsoft UI オートメーション は、Windows の新しいアクセシビリティ モデルであり、支援技術製品と自動テスト ツールのニーズに対応することを目的としています。 UI オートメーションは、Microsoft Active Accessibility に対して多くの機能強化を提供します。 このトピックでは、2 つのテクノロジの違いについて説明します。

このトピックは、次のセクションで構成されています。

プログラミング言語

Microsoft Active Accessibility は、デュアル インターフェイスをサポートするコンポーネント オブジェクト モデル (COM) に基づいているため、C/C++ およびスクリプト言語でプログラミングできます。

UI オートメーションが導入されたとき、クライアント API はマネージド コードに制限されていましたが、プロバイダー API にはマネージド実装とアンマネージド実装の両方が含まれていました。 Windows 7 では、C/C++ でクライアント アプリケーションUI オートメーションプログラミングしやすくするために、新しい COM ベースのクライアント API が導入されました。

サーバーとクライアント

Microsoft Active Accessibility では、サーバーとクライアントは、主に IAccessible インターフェイスのサーバー実装を通じて直接通信します。

UI オートメーションでは、コア サービスはサーバー (プロバイダー) とクライアントの間にあります。 コア サービスは、プロバイダーによって実装されたインターフェイスを呼び出し、UI 要素の一意のランタイム識別子の生成など、追加のサービスを提供します。 クライアント アプリケーションは、 CUIAutomation オブジェクトを作成することで、このコア サービスにアクセスできます。 このオブジェクトは、プロバイダー インターフェイスとは別のクライアント インターフェイスのセットをサポートします。 詳細については、「 CUIAutomation オブジェクトの作成」を参照してください。

UI オートメーション プロバイダーは Microsoft Active Accessibility クライアントに情報を提供でき、Microsoft Active Accessibility サーバーはUI オートメーションクライアント アプリケーションに情報を提供できます。 ただし、Microsoft Active Accessibility はUI オートメーションほど多くの情報を公開しないため、2 つのモデルには完全な互換性がありません。

UI 要素

Microsoft Active Accessibility は、UI 要素を、子識別子と組み合わせて IAccessible インターフェイスとして表示します。 2 つの IAccessible ポインターを比較して、同じ要素を参照しているかどうかを判断することは困難です。

UI オートメーションでは、すべての要素は、IUIAutomationElement インターフェイスをクライアントに公開するオブジェクトとして表されます。 要素は、 IUIAutomationElement::GetRuntimeId を使用して取得されるランタイム識別子によって比較できます。

ツリー ビューとナビゲーション

画面上の UI 要素は、デスクトップをルートとして、アプリケーション ウィンドウを直接の子として、およびアプリケーション内の要素をさらに子孫として持つツリー構造と見なすことができます。

Microsoft Active Accessibility では、エンド ユーザーに関係のない多くの UI 要素がツリー構造で公開されます。 クライアント アプリケーションでは、ツリー内のすべての要素を調べて、意味のある要素を判断する必要があります。

UI オートメーション クライアント アプリケーションは、フィルタリングしたビューを使用して UI を確認します。 ビューには、ユーザーに情報を提供する要素、またはユーザーが操作できる要素のみが含まれます。 コントロール要素のみを含み、コンテンツ要素のみを含む定義済みのビューを使用でき、クライアント アプリケーションではカスタム ビューを定義できます。 UI オートメーションを使用すると、ユーザーに UI を記述し、ユーザーがアプリケーションを操作しやすくなります。

Microsoft Active Accessibility では、要素間のナビゲーションは空間です。たとえば、画面の左側にある要素に移動すると論理的になります。たとえば、ダイアログ ボックスのタブ オーダーの次のメニュー項目や次の項目に移動したり、階層的に移動したりします。たとえば、コンテナー内の最初の子要素に移動したり、子要素から親要素に移動したりします。 階層ナビゲーションは、子要素が IAccessible を実装するオブジェクトであるとは限らないという事実によって複雑になります。

UI オートメーションでは、すべての UI 要素は、IUIAutomationElement インターフェイスを公開し、同じ基本的な機能をサポートする COM オブジェクトです。 プロバイダーの観点から、COM オブジェクトは IRawElementProviderSimple から継承されるインターフェイスを実装します。 ナビゲーションは主に階層構造です。つまり、親から子へ、そして兄弟から次の兄弟へ。 ただし、兄弟間のナビゲーションには、タブ オーダーに従う場合があるため、論理要素があります。 クライアントは、 IUIAutomationTreeWalker を使用して、ツリーのフィルター処理されたビューを使用して、任意の開始点から移動できます。 クライアントは、 IUIAutomationElement::FindFirstIUIAutomationElement::FindAll を使用して、特定の子または子孫に移動することもできます。 たとえば、指定したコントロール パターンをサポートするダイアログ ボックス内のすべての要素を簡単に取得できます。

UI オートメーションのナビゲーションは、Microsoft Active Accessibility よりも一貫性があります。 ドロップダウン リストやポップアップ ウィンドウなどの一部の要素が Microsoft Active Accessibility ツリーに 2 回表示され、それらの要素からのナビゲーションで予期しない結果が発生する可能性があります。 鉄筋コントロールに対して Microsoft Active Accessibility を適切に実装することは困難です。 UI オートメーションは、ウィンドウの所有権によって課される階層にもかかわらず、ツリー内の任意の場所に要素を配置できるように、親の再親と再配置を有効にします。

役割とコントロール型

Microsoft Active Accessibility では、accRole プロパティ (IAccessible::get_accRole) を使用して、UI の要素ロールの説明 ( ROLE_SYSTEM_SLIDERROLE_SYSTEM_MENUITEMなど) を取得します。 要素の役割は、要素の機能を表す主要な鍵になります。 コントロールとの対話は、IAccessible::accSelect や IAccessible::accDoDefaultAction などの固定メソッドを使用して実現されます。 クライアント アプリケーションと UI の間の相互作用は、 IAccessible を介して実行できる操作に制限されます。

これに対し、UI オートメーションは、IUIAutomationElement::CurrentControlType (または IUIAutomationElement::CachedControlType) プロパティによって記述される要素のコントロール型を、期待される機能から切り離します。 機能は、特殊なインターフェイスの実装を通じてプロバイダーによってサポートされる、コントロール パターンによって決定されます。 コントロール パターンを組み合わせて、特定の UI 要素でサポートされている機能の完全なセットを記述できます。 一部のプロバイダーは、特定のコントロール パターンをサポートするために必要です。 たとえば、チェック ボックスのプロバイダーは、トグル コントロール パターンをサポートしている必要があります。 他のプロバイダーは、1 つ以上の一連のコントロール パターンをサポートする必要があります。 たとえば、ボタンはトグルまたは 呼び出 しコントロール パターンをサポートする必要があります。 コントロール パターンをサポートしていないものもあります。 たとえば、移動、サイズ変更、ドッキングできないペインには、コントロール パターンがありません。

UI オートメーションは、UIA_CustomControlTypeId定数で識別されるカスタム コントロールをサポートしており、IUIAutomationElement::CurrentLocalizedControlType (または IUIAutomationElement::CachedLocalizedControlType) プロパティで記述できます。

次の表は、Microsoft Active Accessibilityオブジェクトのロールをコントロールの種類UI オートメーションマップします。

Active Accessibility の役割 UI オートメーション コントロール型
ROLE_SYSTEM_PUSHBUTTON Button
ROLE_SYSTEM_CLIENT Calendar
ROLE_SYSTEM_CHECKBUTTON CheckBox
ROLE_SYSTEM_COMBOBOX ComboBox
ROLE_SYSTEM_CLIENT カスタム コントロールの種類」を参照してください
ROLE_SYSTEM_LIST DataGrid
ROLE_SYSTEM_LISTITEM DataItem
ROLE_SYSTEM_DOCUMENT Document
ROLE_SYSTEM_TEXT 編集
ROLE_SYSTEM_GROUPING グループ
ROLE_SYSTEM_LIST Header
ROLE_SYSTEM_COLUMNHEADER HeaderItem
ROLE_SYSTEM_LINK ハイパーリンク
ROLE_SYSTEM_GRAPHIC イメージ
ROLE_SYSTEM_LIST リスト
ROLE_SYSTEM_LISTITEM ListItem
ROLE_SYSTEM_MENUPOPUP Menu
ROLE_SYSTEM_MENUBAR MenuBar
ROLE_SYSTEM_MENUITEM MenuItem
ROLE_SYSTEM_PANE ペイン
ROLE_SYSTEM_PROGRESSBAR ProgressBar
ROLE_SYSTEM_RADIOBUTTON RadioButton
ROLE_SYSTEM_SCROLLBAR ScrollBar
ROLE_SYSTEM_SEPARATOR Separator
ROLE_SYSTEM_SLIDER Slider
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_SPLITBUTTON SplitButton
ROLE_SYSTEM_STATUSBAR StatusBar
ROLE_SYSTEM_PAGETABLIST タブ
ROLE_SYSTEM_PAGETAB TabItem
ROLE_SYSTEM_TABLE Table
ROLE_SYSTEM_STATICTEXT [テキスト]
ROLE_SYSTEM_INDICATOR つまみ
ROLE_SYSTEM_TITLEBAR TitleBar
ROLE_SYSTEM_TOOLBAR ToolBar
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE ツリー
ROLE_SYSTEM_OUTLINEITEM TreeItem
ROLE_SYSTEM_WINDOW ウィンドウ

 

状態とプロパティ

Microsoft Active Accessibility 要素は、共通のプロパティ セットをサポートします。 accState などの一部のプロパティでは、要素ロールに応じて異なる条件を記述する必要があります。 サーバーは、要素に関連しないプロパティであっても、プロパティを返す IAccessible のすべてのメソッドを実装する必要があります。

UI オートメーションでは、追加のプロパティを定義します。その一部は Microsoft Active Accessibility の状態に対応しています。 一部のプロパティはすべての要素に共通ですが、他のプロパティはコントロールの型とコントロール パターンに固有です。 UI オートメーション プロバイダーは無関係なプロパティを実装する必要はありませんが、サポートされていないプロパティに対して null 値を返すことができます。 UI オートメーションコア サービスは、既定のウィンドウ プロバイダーからいくつかのプロパティを取得でき、これらはプロバイダーによって明示的に実装されたプロパティと統合されます。

UI オートメーションは、より多くのプロパティをサポートするだけでなく、プロパティをキャッシュできるようにすることでパフォーマンスを向上させます。

次の表は、2 つのモデルの一部のプロパティの対応関係を示しています。 UI オートメーション プロパティ ID の説明については、「Automation 要素のプロパティ識別子」を参照してください。

Active Accessibility プロパティ アクセサー UI オートメーションのプロパティ ID 解説
get_accKeyboardShortcut UIA_AccessKeyPropertyId または UIA_AcceleratorKeyPropertyId 両方が 存在する場合は、UIA_AccessKeyPropertyIdが優先されます。
get_accName UIA_NamePropertyId
get_accRole UIA_ControlTypePropertyId ロールをコントロール型にマッピングするには、前の表を参照してください。
get_accValue UIA_ValueValuePropertyId または UIA_RangeValueValuePropertyId IUIAutomationValuePattern または IUIAutomationRangeValuePattern をサポートするコントロール型に対してのみ有効です。 範囲の値は、Microsoft Active Accessibility の動作と一致するように、0 から 100 に正規化されます。 値は文字列として表されます。
get_accHelp UIA_HelpTextPropertyId
accLocation UIA_BoundingRectanglePropertyId
get_accDescription サポートされていません。 accDescription には Microsoft Active Accessibility の明確な仕様がありませんでした。その結果、サーバーはこのプロパティに異なる情報を配置しました。
get_accHelpTopic サポートされていません。

 

次の表は、Microsoft Active Accessibility オブジェクトの状態定数に対応するUI オートメーション プロパティ ID を示しています。

Active Accessibility の状態 UI オートメーションのプロパティ WinEvent 状態の変更をトリガーしますか?
STATE_SYSTEM_CHECKED チェック ボックスのUIA_ToggleToggleStatePropertyId。 ラジオ ボタンのUIA_SelectionItemIsSelectedPropertyId Y
STATE_SYSTEM_COLLAPSED UIA_ExpandCollapseExpandCollapseStatePropertyId (値 = ExpandCollapseState_Collapsed)。 Y
STATE_SYSTEM_EXPANDED UIA_ExpandCollapseExpandCollapseStatePropertyId (value = ExpandCollapseState_Expanded または ExpandCollapseState_PartiallyExpanded)。 Y
STATE_SYSTEM_FOCUSABLE UIA_IsKeyboardFocusablePropertyId N
STATE_SYSTEM_FOCUSED UIA_HasKeyboardFocusPropertyId N
STATE_SYSTEM_HASPOPUP メニュー項目のUIA_ExpandCollapseExpandCollapseStatePropertyId N
STATE_SYSTEM_INVISIBLE UIA_IsOffscreenPropertyId (value = True、 IUIAutomationElement::GetClickablePoint が失敗します)。 N
STATE_SYSTEM_LINKED UIA_ControlTypePropertyId (値 = UIA_HyperlinkControlTypeId)。 N
STATE_SYSTEM_MIXED UIA_ToggleToggleStatePropertyId (value = ToggleState_Indeterminate N
STATE_SYSTEM_MOVEABLE UIA_TransformCanMovePropertyId N
STATE_SYSTEM_MULTISELECTABLE UIA_SelectionCanSelectMultiplePropertyId N
STATE_SYSTEM_OFFSCREEN UIA_IsOffscreenPropertyId N
STATE_SYSTEM_PROTECTED UIA_IsPasswordPropertyId N
STATE_SYSTEM_READONLY UIA_RangeValueIsReadOnlyPropertyIdUIA_ValueIsReadOnlyPropertyId N
STATE_SYSTEM_SELECTABLE をUIA_IsSelectionItemPatternAvailablePropertyId します。 ×
STATE_SYSTEM_SELECTED UIA_SelectionItemIsSelectedPropertyId ×
STATE_SYSTEM_SIZEABLE UIA_TransformCanResizePropertyId ×
STATE_SYSTEM_UNAVAILABLE UIA_IsEnabledPropertyId Y

 

プロパティ ID の完全な一覧については、「 プロパティ識別子」を参照してください。

イベント

Microsoft Active Accessibility とは異なり、UI オートメーションのイベント メカニズムは、ウィンドウ ハンドルに密接に関連付けられている Windows イベント ルーティングに依存せず、クライアント アプリケーションでフックを設定する必要はありません。 イベントのサブスクリプションは、特定のイベントだけでなく、ツリーの特定の部分に合わせて微調整できます。 プロバイダーは、リッスンしているイベントを追跡することで、イベントの発生を微調整することもできます。

イベントがイベント コールバックに直接渡されるため、イベントを発生させる要素をクライアントが取得する方が簡単です。 クライアントがイベントをサブスクライブしたときにキャッシュ要求が指定された場合、要素のプロパティは自動的にプリフェッチされます。

次の表は、Microsoft Active Accessibility イベント定数とUI オートメーションイベント ID の対応を示しています。

WinEvent UI オートメーション イベント ID
EVENT_OBJECT_ACCELERATORCHANGE UIA_AcceleratorKeyPropertyIdプロパティの 変更。
EVENT_OBJECT_CONTENTSCROLLED 関連付 けられたスクロール バー UIA_ScrollVerticalScrollPercentPropertyId プロパティまたはUIA_ScrollHorizontalScrollPercentPropertyIdプロパティの変更。
EVENT_OBJECT_CREATE UIA_StructureChangedEventId
EVENT_OBJECT_DEFACTIONCHANGE 同等の関数はありません。
EVENT_OBJECT_DESCRIPTIONCHANGE 正確に同等の値はありません。おそらく 、UIA_HelpTextPropertyId または UIA_LocalizedControlTypePropertyId プロパティの変更です。
EVENT_OBJECT_DESTROY UIA_StructureChangedEventId
EVENT_OBJECT_FOCUS UIA_AutomationFocusChangedEventId
EVENT_OBJECT_HELPCHANGE UIA_HelpTextPropertyId 変更。
EVENT_OBJECT_HIDE UIA_StructureChangedEventId
EVENT_OBJECT_LOCATIONCHANGE UIA_BoundingRectanglePropertyIdプロパティの 変更。
EVENT_OBJECT_NAMECHANGE UIA_NamePropertyIdプロパティの 変更。
EVENT_OBJECT_PARENTCHANGE UIA_StructureChangedEventId
EVENT_OBJECT_REORDER Microsoft Active Accessibility では一貫して使用されません。 直接対応するイベントが UI オートメーションでは定義されていません。
EVENT_OBJECT_SELECTION UIA_SelectionItem_ElementSelectedEventId
EVENT_OBJECT_SELECTIONADD UIA_SelectionItem_ElementAddedToSelectionEventId
EVENT_OBJECT_SELECTIONREMOVE UIA_SelectionItem_ElementRemovedFromSelectionEventId
EVENT_OBJECT_SELECTIONWITHIN 同等の関数はありません。
EVENT_OBJECT_SHOW UIA_StructureChangedEventId
EVENT_OBJECT_STATECHANGE さまざまなプロパティ変更イベント。
EVENT_OBJECT_VALUECHANGE UIA_RangeValueValuePropertyIdUIA_ValueValuePropertyId が変更されました。
EVENT_SYSTEM_ALERT 同等の関数はありません。
EVENT_SYSTEM_CAPTUREEND 同等の関数はありません。
EVENT_SYSTEM_CAPTURESTART 同等の関数はありません。
EVENT_SYSTEM_CONTEXTHELPEND 同等の関数はありません。
EVENT_SYSTEM_CONTEXTHELPSTART 同等の関数はありません。
EVENT_SYSTEM_DIALOGEND UIA_Window_WindowClosedEventId
EVENT_SYSTEM_DIALOGSTART UIA_Window_WindowOpenedEventId
EVENT_SYSTEM_DRAGDROPEND 同等の関数はありません。
EVENT_SYSTEM_DRAGDROPSTART 同等の関数はありません。
EVENT_SYSTEM_FOREGROUND UIA_AutomationFocusChangedEventId
EVENT_SYSTEM_MENUEND UIA_MenuModeEndEventId
EVENT_SYSTEM_MENUPOPUPEND UIA_MenuClosedEventId
EVENT_SYSTEM_MENUPOPUPSTART UIA_MenuOpenedEventId
EVENT_SYSTEM_MENUSTART UIA_MenuModeStartEventId
EVENT_SYSTEM_MINIMIZEEND プロパティの変更UIA_WindowWindowVisualStatePropertyId
EVENT_SYSTEM_MINIMIZESTART プロパティの変更UIA_WindowWindowVisualStatePropertyId
EVENT_SYSTEM_MOVESIZEEND プロパティの変更UIA_BoundingRectanglePropertyId
EVENT_SYSTEM_MOVESIZESTART プロパティの変更UIA_BoundingRectanglePropertyId
EVENT_SYSTEM_SCROLLINGEND プロパティの変更をUIA_ScrollVerticalScrollPercentPropertyId または UIA_ScrollHorizontalScrollPercentPropertyId します。
EVENT_SYSTEM_SCROLLINGSTART プロパティの変更をUIA_ScrollVerticalScrollPercentPropertyId または UIA_ScrollHorizontalScrollPercentPropertyId します。
EVENT_SYSTEM_SOUND 同等の関数はありません。
EVENT_SYSTEM_SWITCHEND 同等ではありませんが、 UIA_AutomationFocusChangedEventId イベントは、新しいアプリケーションがフォーカスを受け取ったことを通知します。
EVENT_SYSTEM_SWITCHSTART 同等の関数はありません。
同等の関数はありません。 プロパティの変更UIA_MultipleViewCurrentViewPropertyId
同等の関数はありません。 プロパティの変更UIA_ScrollHorizontallyScrollablePropertyId
同等の関数はありません。 プロパティの変更UIA_ScrollVerticallyScrollablePropertyId
同等の関数はありません。 プロパティの変更UIA_ScrollHorizontalScrollPercentPropertyId
同等の関数はありません。 プロパティの変更UIA_ScrollVerticalScrollPercentPropertyId
同等の関数はありません。 プロパティの変更UIA_ScrollHorizontalViewSizePropertyId
同等の関数はありません。 プロパティの変更UIA_ScrollVerticalViewSizePropertyId
同等の関数はありません。 プロパティの変更UIA_ToggleToggleStatePropertyId
同等の関数はありません。 プロパティの変更UIA_WindowWindowVisualStatePropertyId
同等の関数はありません。 UIA_AsyncContentLoadedEventId イベントです。
同等の関数はありません。 UIA_ToolTipOpenedEventId イベント。

 

UI オートメーションからアクティブなアクセシビリティ プロパティとオブジェクトにアクセスする

Microsoft Active Accessibility で使用できないUI オートメーションの主な機能は、1 回のクロスプロセス操作で複数のプロパティをフェッチできることです。

既存の Microsoft Active Accessibility クライアントは、 IUIAutomationLegacyIAccessiblePattern インターフェイスを使用することで、この機能を利用できます。 このインターフェイスは、UI 要素で Microsoft Active Accessibility のプロパティとメソッドを公開する コントロール パターン を表します。 要素を取得するときに、アプリケーションは、このコントロール パターンとそのプロパティをキャッシュすることを要求できます。

IUIAutomationLegacyIAccessiblePattern を使用すると、クライアントは IAccessible のネイティブ サポートを持たない要素から Microsoft Active Accessibility プロパティを取得することもできます。

IUIAutomationLegacyIAccessiblePattern のプロパティを変更した場合、UI オートメーションイベントは発生しません。

アクティブなアクセシビリティ サーバーへのUI オートメーション機能の追加

UI オートメーション ツリーの概要

UI オートメーション プロパティの概要

UI オートメーション コントロール型の概要

UI オートメーション イベントの概要

Microsoft Active Accessibility