UI オートメーションと Microsoft Active Accessibility
Note
このドキュメントは、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 オートメーション (標準コントロールのクライアント側プロバイダー ライブラリを含む) はマネージド コードで記述されており、C# または Visual Basic .NET を使用して UI オートメーション クライアント アプリケーションを実に簡単にプログラムすることができます。 インターフェイスを実装する 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 クライアントに情報を提供でき、Active Accessibility サーバーは UI オートメーション クライアント アプリケーションに情報を提供できます。 ただし、Active Accessibility は UI オートメーションほど多くの情報を公開しないため、この 2 つのモデルには完全な互換性がありません。
UI 要素
Active Accessibility では UI 要素を IAccessible
インターフェイスまたは子識別子として表現します。 2 つの IAccessible
ポインターを比較してそれらが同じ要素を参照しているかどうかを判断するのは困難です。
UI オートメーションでは、すべての要素が AutomationElement オブジェクトとして表現されます。 比較は等値演算子または Equals メソッドを使用して行われますが、どちらの方法でも、要素の一意のランタイム識別子が比較されます。
ツリー ビューとナビゲーション
画面上の UI インターフェイス (UI) 要素は、ツリー構造で表すことができます。デスクトップがルートで、その直接の子としてアプリケーション ウィンドウがあり、アプリケーション内の要素がその子孫となります。
Active Accessibility では、エンドユーザーには無関係なオートメーション要素も多数、ツリー内に公開されます。 クライアント アプリケーションは、すべての要素の中から意味のあるものを特定する必要があります。
UI オートメーション クライアント アプリケーションは、フィルタリングしたビューを使用して UI を確認します。 このビューには、必要な要素 (ユーザーに情報を提供したり、対話を可能にしたりする要素) のみが表示されます。 コントロール要素だけが含まれるビューや、コンテンツ要素だけが含まれるビューがあらかじめ定義されています。さらに、アプリケーションでカスタム ビューを定義することもできます。 UI オートメーションは、ユーザーに対して UI を簡単に表せるようにして、ユーザーとアプリケーションの対話を支援します。
Active Accessibility における要素間ナビゲーションは、空間的 (画面上で左にある要素に移動するなど)、論理的 (次のメニュー項目に移動する、ダイアログ ボックスのタブ オーダー内で次の項目に移動するなど)、階層的 (コンテナー内の最初の子に移動する、子からその親に移動するなど) のいずれかです。 子要素が IAccessible
を実装しているオブジェクトであるとは限らないため、階層的ナビゲーションは複雑です。
UI オートメーションでは、すべての UI 要素が、同じ基本機能をサポートする AutomationElement オブジェクトです。 (プロバイダーの観点では、IRawElementProviderSimple から継承されたインターフェイスを実装するオブジェクトです)。ナビゲーションは主に階層的 (親から子、兄弟から次の兄弟) です (兄弟間のナビゲーションは、タブ オーダーに従う場合があるため、論理的要素も持っています)。フィルタリングされたツリー ビューで TreeWalker クラスを使用して、任意の場所からナビゲーションを開始できます。 FindFirst と FindAllを使用して、特定の子または子孫に移動することもできます。たとえば、指定したコントロール パターンがサポートされるダイアログ ボックス内のすべての要素を非常に簡単に取得できます。
UI オートメーションにおけるナビゲーションは、Active Accessibility の場合より一貫性があります。 ドロップダウン リストやポップアップ ウィンドウなど、Active Accessibility ツリーに 2 回表示される要素がありますが、このような要素からナビゲーションすると、予期しない結果が生じる可能性があります。 実際には、rebar コントロールに対して Active Accessibility を正しく実装することは不可能です。 UI オートメーションでは親の再指定や位置変更が可能なため、ウィンドウの所有関係による階層にかかわらず、要素をツリー内の任意の場所に配置できます。
役割とコントロール型
Active Accessibility は、accRole
プロパティ (IAccessible::get_actRole
) を使用して、ROLE_SYSTEM_SLIDER や ROLE_SYSTEM_MENUITEM などの UI 内の要素の役割の記述を取得します。 要素の役割は、要素の機能を表す主要な鍵になります。 コントロールとの対話は、 IAccessible::accSelect
や IAccessible::accDoDefaultAction
などの固定のメソッドを使用して実現されます。 クライアント アプリケーションと UI の間の対話は、IAccessible
を通して実行できる範囲に限定されます。
これに対して、UI オートメーションでは、要素のコントロール型 (ControlType プロパティで記述) と、それに期待される機能とが大きく分離されています。 機能は、特殊なインターフェイスの実装を通じてプロバイダーによってサポートされる、コントロール パターンによって決定されます。 複数のコントロール パターンを組み合わせると、特定の UI 要素がサポートする機能をすべて記述することができます。 プロバイダーによっては、ある 1 つの特定のコントロール パターンをサポートしなければならないものがあります。たとえば、チェック ボックスのプロバイダーは Toggle コントロール パターンをサポートする必要があります。 また、コントロール パターンのセットを 1 つ以上サポートしなければならないものもあります。たとえば、ボタンは、Toggle と Invoke のいずれかをサポートする必要があります。 さらに、コントロール パターンをまったくサポートしないものもあります。たとえば、移動もサイズ変更もドッキングもできないペインには、コントロール パターンはありません。
UI オートメーションは、Custom プロパティによって識別され、LocalizedControlTypeProperty プロパティによって記述可能なカスタム コントロールをサポートします。
次の表に、Active Accessibility の役割と UI オートメーションのコントロール型のマッピングを示します。
Active Accessibility の役割 | UI オートメーション コントロール型 |
---|---|
ROLE_SYSTEM_PUSHBUTTON | ボタン |
ROLE_SYSTEM_CLIENT | Calendar |
ROLE_SYSTEM_CHECKBUTTON | チェック ボックス |
ROLE_SYSTEM_COMBOBOX | コンボ ボックス |
ROLE_SYSTEM_CLIENT | Custom |
ROLE_SYSTEM_LIST | データ グリッド |
ROLE_SYSTEM_LISTITEM | データ アイテム |
ROLE_SYSTEM_DOCUMENT | ドキュメント |
ROLE_SYSTEM_TEXT | [編集] |
ROLE_SYSTEM_GROUPING | Group |
ROLE_SYSTEM_LIST | ヘッダー |
ROLE_SYSTEM_COLUMNHEADER | ヘッダー項目 |
ROLE_SYSTEM_LINK | ハイパーリンク |
ROLE_SYSTEM_GRAPHIC | Image |
ROLE_SYSTEM_LIST | 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 | Spinner |
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 | ToolTip |
ROLE_SYSTEM_OUTLINE | ツリー |
ROLE_SYSTEM_OUTLINEITEM | ツリー項目 |
ROLE_SYSTEM_WINDOW | ウィンドウ |
さまざまなコントロール型の詳細については、「 UI Automation Control Types」を参照してください。
状態とプロパティ
Active Accessibility では、要素は一般的なプロパティのセットをサポートします。一部のプロパティ (accState
など) は、要素の役割に応じてまったく異なる内容を記述する必要があります。 サーバーは、プロパティを返す IAccessible
のメソッドをすべて (要素に無関係なものも含む) 実装する必要があります。
UI オートメーションでは、さらに多くのプロパティが定義されており、その一部は Active Accessibility での状態に対応します。 すべての要素に共通するものもあれば、コントロール型とコントロール パターンに固有のものもあります。 プロパティは一意の識別子によって識別され、ほとんどのプロパティは単一のメソッド ( GetCurrentPropertyValue または GetCachedPropertyValue) を使用して取得できます。 多くのプロパティは、 Current プロパティ アクセサーおよび Cached プロパティ アクセサーからも容易に取得できます。
UI オートメーション プロバイダーは、無関係なプロパティを実装する必要はなく、サポートしていないプロパティに対しては単に null
値を返すことができます。 また、UI オートメーションのコア サービスは、一部のプロパティを既定のウィンドウ プロバイダーから取得できます。これらは、プロバイダーによって明示的に実装されたプロパティと 1 つにまとめられます。
UI オートメーションでは、多くのプロパティをサポートすることに加えて、単一のプロセス間呼び出しで複数のプロパティを取得できるので、パフォーマンスが向上します。
次の表に、2 つのモデルのプロパティ間の対応を示します。
Active Accessibility プロパティ アクセサー | UI オートメーションのプロパティ ID | 解説 |
---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty または AcceleratorKeyProperty | 両方とも存在する場合はAccessKeyProperty が優先されます。 |
get_accName |
NameProperty | |
get_accRole |
ControlTypeProperty | 役割とコントロール型のマッピングについては、前の表を参照してください。 |
get_accValue |
ValuePattern.ValueProperty RangeValuePattern.ValueProperty |
ValuePattern または RangeValuePattern をサポートするコントロール型でのみ有効です。 MSAA 動作との一貫性を保つために、RangeValue 値は 0 ~ 100 に正規化されます。 Value 項目は文字列を使用します。 |
get_accHelp |
HelpTextProperty | |
accLocation |
BoundingRectangleProperty | |
get_accDescription |
UI オートメーションではサポート対象外 | accDescription に関する明確な仕様が MSAA 内に存在しなかったので、このプロパティに格納される情報はプロバイダーによって異なります。 |
get_accHelpTopic |
UI オートメーションではサポート対象外 |
次の表に、UI オートメーション プロパティと Active Accessibility の状態定数との対応を示します。
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 オートメーション プロパティの概要」を参照してください。
events
UI オートメーションのイベント機構は、Active Accessibility とは異なり、Windows のイベント ルーティング (ウィンドウ ハンドルと密接に関連する) に依存せず、クライアント アプリケーションでフックを設定する必要もありません。 イベントのサブスクリプションは、特定のイベントに対してだけでなく、ツリーの特定の部分を対象とするように細かく調整できます。 プロバイダーも、リッスンされているイベントを追跡して、イベントの生成を細かく調整できます。
イベントを生成した要素をクライアントで取得することも簡単です。このような要素は、イベント コールバックに直接渡されるからです。 クライアントがイベントをサブスクライブしているときにキャッシュ要求がアクティブであった場合は、自動的に要素のプロパティがプリフェッチされます。
次の表に、Active Accessibility の WinEvent と UI オートメーションのイベントとの対応を示します。
WinEvent | UI オートメーション イベント識別子 |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE | AcceleratorKeyProperty プロパティの変更 |
EVENT_OBJECT_CONTENTSCROLLED | 関連付けられたスクロール バーにおける または プロパティの変更 |
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 オートメーション コア サービスが行います。