次の方法で共有


UI オートメーションと Microsoft Active Accessibility

このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージド UI オートメーション クラスを使用する .NET Framework 開発者を対象としています。 UI オートメーションの最新情報については、「Windows Automation 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 オートメーション (標準コントロール用のクライアント側プロバイダー ライブラリを含む) はマネージド コードで記述され、UI オートメーション クライアント アプリケーションは C# または Visual Basic .NET を使用して最も簡単にプログラミングできます。 インターフェイス実装である UI オートメーション プロバイダーは、マネージド コードまたは C/C++ で記述できます。

Windows Presentation Foundation でのサポート

Windows Presentation Foundation (WPF) は、ユーザー インターフェイスを作成するための新しいモデルです。 WPF 要素には、Active Accessibility のネイティブ サポートは含まれていません。ただし、UI オートメーションはサポートされています。これには、Active Accessibility クライアントのブリッジサポートが含まれます。 UI オートメーション専用に記述されたクライアントのみが、テキストの豊富なサポートなど、WPF のアクセシビリティ機能を最大限に活用できます。

サーバーとクライアント

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

UI オートメーションでは、コア サービスはサーバー (プロバイダーと呼ばれます) とクライアントの間にあります。 コア サービスは、プロバイダーによって実装されたインターフェイスを呼び出し、要素の一意のランタイム識別子の生成などの追加サービスを提供します。 クライアント アプリケーションは、ライブラリ関数を使用して UI オートメーション サービスを呼び出します。

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

UI 要素

Active Accessibility は、ui 要素を IAccessible インターフェイスまたは子識別子として表示します。 2 つの 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 ツリーに 2 回表示され、それらの要素からのナビゲーションに予期しない結果が生じる可能性があります。 実際には、鉄筋コントロールのアクティブ アクセシビリティを適切に実装することはできません。 UI オートメーションを使用すると、親の変更と再配置が可能になり、ウィンドウの所有権によって階層が課されているにもかかわらず、要素をツリー内の任意の場所に配置できます。

役割とコントロール型

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

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

UI オートメーションでは、 Custom プロパティによって識別され、 LocalizedControlTypeProperty プロパティで記述できるカスタム コントロールがサポートされています。

次の表は、アクティブなアクセシビリティ ロールと UI オートメーション コントロールの種類のマッピングを示しています。

Active Accessibility の役割 UI オートメーション コントロールの種類
ROLE_SYSTEM_PUSHBUTTON ボタン
ROLE_SYSTEM_CLIENT カレンダー
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
ROLE_SYSTEM_STATICTEXT テキスト
ROLE_SYSTEM_INDICATOR 親指
ROLE_SYSTEM_TITLEBAR タイトル バー
ROLE_SYSTEM_TOOLBAR ツール バー
ROLE_SYSTEM_TOOLTIP ツールヒント
ROLE_SYSTEM_OUTLINE ツリー
ROLE_SYSTEM_OUTLINEITEM ツリー項目
ROLE_SYSTEM_WINDOW ウィンドウ

さまざまなコントロールの種類の詳細については、「 UI オートメーション コントロールの種類」を参照してください。

状態とプロパティ

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

UI オートメーションではさらに多くのプロパティが定義されており、その一部は Active Accessibility の状態に対応しています。 一部はすべての要素に共通ですが、他の要素はコントロール型とコントロール パターンに固有です。 プロパティは一意の識別子によって区別され、ほとんどのプロパティは 1 つのメソッド、 GetCurrentPropertyValue 、または GetCachedPropertyValueを使用して取得できます。 多くのプロパティは、 Current および Cached プロパティ アクセサーからも簡単に取得できます。

UI オートメーション プロバイダーは、無関係なプロパティを実装する必要はありませんが、サポートされていないプロパティに対して null 値を返すだけです。 また、UI オートメーション コア サービスは、既定のウィンドウ プロバイダーからいくつかのプロパティを取得できます。これらは、プロバイダーによって明示的に実装されたプロパティと統合されます。

UI オートメーションは、より多くのプロパティをサポートするだけでなく、1 回のクロスプロセス呼び出しで複数のプロパティを取得できるようにすることで、パフォーマンスを向上させます。

次の表に、2 つのモデルのプロパティ間の対応を示します。

Active Accessibility プロパティ アクセサー UI オートメーションのプロパティ ID 注釈
get_accKeyboardShortcut AccessKeyProperty または AcceleratorKeyProperty AccessKeyProperty は、両方が存在する場合に優先されます。
get_accName NameProperty
get_accRole ControlTypeProperty ロールとコントロール型のマッピングについては、前の表を参照してください。
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
ValuePattern または RangeValuePattern をサポートするコントロール型に対してのみ有効です。 RangeValue 値は、MSAA の動作と一致するように 0 から 100 に正規化されます。 値項目は文字列を使用します。
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription UI オートメーションではサポートされていません accDescription は MSAA 内で明確な仕様を持たなかったため、プロバイダーはこのプロパティに異なる情報を配置しました。
get_accHelpTopic UI オートメーションではサポートされていません

次の表に、アクティブなアクセシビリティ状態定数に対応する UI オートメーション プロパティを示します。

Active Accessibility の状態 UI オートメーション プロパティ 状態変更をトリガーしますか?
STATE_SYSTEM_CHECKED チェック ボックスの場合、 ToggleStateProperty

ラジオ ボタンの場合、 IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded または PartiallyExpanded 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 オートメーションに相当するものがありません。

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 VerticalScrollPercentProperty または、関連付けられているスクロール バーのプロパティの変更を HorizontalScrollPercentProperty します
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE 同等の値はありません
EVENT_OBJECT_DESCRIPTIONCHANGE 正確に同等の値はありません。おそらく HelpTextProperty または LocalizedControlTypeProperty プロパティの変更
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.ValueProperty変更ValuePattern.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 VerticalScrollPercentPropertyまたはプロパティの変更HorizontalScrollPercentProperty
EVENT_SYSTEM_SCROLLINGSTART VerticalScrollPercentPropertyまたはプロパティの変更HorizontalScrollPercentProperty
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 オートメーション コア サービスは、必要なすべての集計を行います。

こちらも参照ください