注
このドキュメントは、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 クラスを使用して、ツリーのフィルター処理されたビューを使用して、任意の開始点から移動できます。 FindFirstとFindAllを使用して、特定の子または子孫に移動することもできます。たとえば、指定したコントロール パターンをサポートするダイアログ ボックス内のすべての要素を簡単に取得できます。
UI オートメーションでのナビゲーションは、Active Accessibility よりも一貫性があります。 ドロップダウン リストやポップアップ ウィンドウなどの一部の要素は、Active Accessibility ツリーに 2 回表示され、それらの要素からのナビゲーションに予期しない結果が生じる可能性があります。 実際には、鉄筋コントロールのアクティブ アクセシビリティを適切に実装することはできません。 UI オートメーションを使用すると、親の変更と再配置が可能になり、ウィンドウの所有権によって階層が課されているにもかかわらず、要素をツリー内の任意の場所に配置できます。
役割とコントロール型
Active Accessibility では、 accRole
プロパティ (IAccessible::get_actRole
) を使用して、UI での要素のロールの説明 (ROLE_SYSTEM_SLIDERやROLE_SYSTEM_MENUITEMなど) を取得します。 要素の役割は、要素の機能を表す主要な鍵になります。 コントロールとの相互作用は、 IAccessible::accSelect
や IAccessible::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.IsReadOnlyProperty と ValuePattern.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 オートメーション コア サービスは、必要なすべての集計を行います。