UI オートメーションと Microsoft Active Accessibility
メモ |
---|
このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージ UI Automation クラスを使用する .NET Framework 開発者を対象としています。UI Automationに関する最新情報については、「Windows Automation API: UI Automation (Windows オートメーション API: UI オートメーション)」を参照してください。 |
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 (標準コントロール用のクライアント側プロバイダー ライブラリを含む) はマネージ コードで記述されており、UI オートメーション クライアント アプリケーションをプログラミングするには、Microsoft Visual C# または Microsoft Visual Basic .NET を使用するのが最も簡単です。 インターフェイス実装である UI オートメーション プロバイダーは、マネージ コードでも 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よりも少ないので、この 2 つのモデルは完全互換ではありません。
UI 要素
Active Accessibility では、UI 要素を IAccessible インターフェイスまたは子識別子として表します。 2 つの IAccessible ポインターを比較して、同じ要素を参照しているかどうかを判断するのは困難です。
UI Automationでは、各要素を AutomationElement オブジェクトとして表します。 比較を行うには、等値演算子または Equals メソッドを使用します。どちらの方法も、要素の一意のランタイム識別子を比較します。
ツリー ビューとナビゲーション
画面上の user interface (UI) 要素は、ツリー構造で表すことができます。デスクトップがルートで、その直接の子としてアプリケーション ウィンドウがあり、アプリケーション内の要素がその子孫となります。
Active Accessibility では、エンド ユーザーに無関係なオートメーション要素も多数、ツリー内に公開されます。 クライアント アプリケーションでは、すべての要素を調べて、意味のある要素を特定する必要があります。
UI オートメーション クライアント アプリケーションからは、UI はフィルタリングされたビューとして見えます。 ビューには、関係のある要素だけが含まれます。つまり、ユーザーに情報を提供したり操作を可能にしたりするための要素です。 コントロール要素だけが含まれるビューや、コンテンツ要素だけが含まれるビューがあらかじめ定義されています。さらに、アプリケーションでカスタム ビューを定義することもできます。 UI Automationを利用すると、ユーザーに提示する UI を容易に記述でき、ユーザーとアプリケーションとの対話を作成しやすくなります。
Active Accessibility における要素間ナビゲーションは、空間的 (たとえば画面上で左にある要素に移動する)、論理的 (次のメニュー項目への移動、ダイアログ ボックスのタブ オーダー内で次の項目への移動など)、階層的 (コンテナー内の最初の子の移動、子からその親への移動など) のいずれかです。 子要素が IAccessible を実装しているオブジェクトであるとは限らないため、階層的ナビゲーションは複雑です。
UI Automationでは、すべての UI 要素が AutomationElement オブジェクトであり、同じ基本機能をサポートしています プロバイダーから見ると、これらは、IRawElementProviderSimple から継承されたインターフェイスを実装するオブジェクトです。 ナビゲーションは主に階層的 (親から子、兄弟から次の兄弟) です。 兄弟間のナビゲーションは、タブ オーダーに従う場合があるため、論理要素も持っています。 ナビゲーションは任意の場所から開始でき、ツリーのフィルター処理された任意のビューを使用できます。ナビゲーションには、TreeWalker クラスを使用します。 また、FindFirst および FindAll を使用して、特定の子や子孫に移動することもできます。たとえば、指定したコントロール パターンをサポートするダイアログ ボックス内からすべての要素を取得することも、非常に簡単です。
UI Automationにおけるナビゲーションは、Active Accessibility の場合よりも一貫性に優れています。 ドロップダウン リストやポップアップ ウィンドウなどの要素は、Active Accessibility ツリーに 2 回表示されますが、このような要素からのナビゲーションでは予期しない結果が生じる可能性があります。 実際には、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 のコントロール パターンをサポートする必要があります。 また、コントロール パターンのセットのうちの 1 つ以上をプロバイダーがサポートしなければならないこともあります。たとえば、ボタンは、Toggle と Invoke のいずれかをサポートする必要があります。 さらに、コントロール パターンをまったくサポートしない場合もあります。たとえば、移動、サイズ変更、およびドッキングができないペインには、コントロール パターンがありません。
UI Automationでは、カスタム コントロールがサポートされます。カスタム コントロールは、Custom プロパティで指定され、LocalizedControlTypeProperty プロパティで記述されます。
Active Accessibility のロールと UI Automationのコントロール型のマッピングを次の表に示します。
Active Accessibility のロール |
UI Automationのコントロール型 |
---|---|
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 Automationでは、さらに多くのプロパティが定義されており、その一部は Active Accessibility での状態に対応します。 すべての要素に共通のものもあれば、コントロール型やコントロール パターンに固有のものもあります。 プロパティは一意の識別子によって識別され、ほとんどのプロパティは単一のメソッド (GetCurrentPropertyValue または GetCachedPropertyValue) を使用して取得できます。 多くのプロパティは、Current プロパティ アクセサーおよび Cached プロパティ アクセサーからも容易に取得できます。
UI オートメーション プロバイダーは、無関係なプロパティを実装する必要はなく、サポートしていないプロパティに対しては null 値を返すことができます。 また、UI Automationのコア サービスは、一部のプロパティを既定のウィンドウ プロバイダーから取得できます。これらのプロパティは、プロバイダーにより明示的に実装されたプロパティとで 1 つにまとめられます。
UI Automationでは、多くのプロパティをサポートすることに加えて、単一のプロセス間呼び出しで複数のプロパティを取得できるので、パフォーマンスが向上します。
2 つのモデルのプロパティ間の対応を次の表に示します。
Active Accessibility のプロパティ アクセサー |
UI Automationのプロパティ ID |
解説 |
---|---|---|
get_accKeyboardShortcut |
両方とも存在する場合は AccessKeyProperty が優先されます。 |
|
get_accName |
|
|
get_accRole |
ロールとコントロール型のマッピングについては、前の表を参照してください。 |
|
get_accValue |
ValuePattern または RangeValuePattern をサポートするコントロール型でのみ有効です。 MSAA 動作との一貫性を保つために、RangeValue 値は 0 ~ 100 に正規化されます。 Value 項目は文字列を使用します。 |
|
get_accHelp |
||
accLocation |
||
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 |
Y |
|
STATE_SYSTEM_EXPANDED |
Y |
|
STATE_SYSTEM_FOCUSABLE |
N |
|
STATE_SYSTEM_FOCUSED |
N |
|
STATE_SYSTEM_HASPOPUP |
ExpandCollapsePattern (メニュー項目の場合) |
N |
STATE_SYSTEM_INVISIBLE |
IsOffscreenProperty = True かつ GetClickablePoint の場合に NoClickablePointException が発生 |
N |
STATE_SYSTEM_LINKED |
N |
|
STATE_SYSTEM_MIXED |
N |
|
STATE_SYSTEM_MOVEABLE |
N |
|
STATE_SYSTEM_MUTLISELECTABLE |
N |
|
STATE_SYSTEM_OFFSCREEN |
IsOffscreenProperty = True |
N |
STATE_SYSTEM_PROTECTED |
N |
|
STATE_SYSTEM_READONLY |
RangeValuePattern.IsReadOnlyProperty および ValuePattern.IsReadOnlyProperty |
N |
STATE_SYSTEM_SELECTABLE |
SelectionItemPattern がサポートされています |
N |
STATE_SYSTEM_SELECTED |
N |
|
STATE_SYSTEM_SIZEABLE |
N |
|
STATE_SYSTEM_UNAVAILABLE |
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 |
関連付けられたスクロール バーにおける VerticalScrollPercentProperty プロパティまたは HorizontalScrollPercentProperty プロパティの変更 |
EVENT_OBJECT_CREATE |
|
EVENT_OBJECT_DEFACTIONCHANGE |
同等の項目はありません |
EVENT_OBJECT_DESCRIPTIONCHANGE |
まったく同等の項目はありません (おそらく HelpTextProperty プロパティまたは LocalizedControlTypeProperty プロパティの変更) |
EVENT_OBJECT_DESTROY |
|
EVENT_OBJECT_FOCUS |
|
EVENT_OBJECT_HELPCHANGE |
HelpTextProperty の変更 |
EVENT_OBJECT_HIDE |
|
EVENT_OBJECT_LOCATIONCHANGE |
BoundingRectangleProperty プロパティの変更 |
EVENT_OBJECT_NAMECHANGE |
NameProperty プロパティの変更 |
EVENT_OBJECT_PARENTCHANGE |
|
EVENT_OBJECT_REORDER |
Active Accessibility での使用は一貫していません。 直接対応するイベントが UI Automationでは定義されていません。 |
EVENT_OBJECT_SELECTION |
|
EVENT_OBJECT_SELECTIONADD |
|
EVENT_OBJECT_SELECTIONREMOVE |
|
EVENT_OBJECT_SELECTIONWITHIN |
同等の項目はありません |
EVENT_OBJECT_SHOW |
|
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 |
|
EVENT_SYSTEM_DIALOGSTART |
|
EVENT_SYSTEM_DRAGDROPEND |
同等の項目はありません |
EVENT_SYSTEM_DRAGDROPSTART |
同等の項目はありません |
EVENT_SYSTEM_FOREGROUND |
|
EVENT_SYSTEM_MENUEND |
|
EVENT_SYSTEM_MENUPOPUPEND |
|
EVENT_SYSTEM_MENUPOPUPSTART |
|
EVENT_SYSTEM_MENUSTART |
|
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 プロパティの変更 |
同等の項目はありません |
|
同等の項目はありません |
セキュリティ
IAccessible をカスタマイズするシナリオでは、基本 IAccessible をラップしてからこれに対する呼び出しを行うという要件が生じることがあります。 このことは、セキュリティに影響を及ぼします。部分信頼コンポーネントにコード パスを中継させてはならないからです。
UI Automation モデルでは、プロバイダーが他のプロバイダー コードへの呼び出しを行う必要がありません。 必要な集約はすべて UI Automation コア サービスが行います。