UI オートメーションとアクティブなアクセシビリティ
Microsoft Active Accessibility は、Windows 95 で導入され、Windows アプリケーションにアクセスできるように設計されたレガシ API です。 Microsoft UI オートメーション は、Windows の新しいアクセシビリティ モデルであり、支援技術製品と自動テスト ツールのニーズに対応することを目的としています。 UI オートメーションは、Microsoft Active Accessibility に対して多くの機能強化を提供します。 このトピックでは、2 つのテクノロジの違いについて説明します。
このトピックは、次のセクションで構成されています。
- プログラミング言語
- サーバーとクライアント
- UI 要素
- ツリー ビューとナビゲーション
- 役割とコントロール型
- 状態とプロパティ
- イベント
- UI オートメーションからアクティブなアクセシビリティ プロパティとオブジェクトにアクセスする
- 関連トピック
プログラミング言語
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::FindFirst と IUIAutomationElement::FindAll を使用して、特定の子または子孫に移動することもできます。 たとえば、指定したコントロール パターンをサポートするダイアログ ボックス内のすべての要素を簡単に取得できます。
UI オートメーションのナビゲーションは、Microsoft Active Accessibility よりも一貫性があります。 ドロップダウン リストやポップアップ ウィンドウなどの一部の要素が Microsoft Active Accessibility ツリーに 2 回表示され、それらの要素からのナビゲーションで予期しない結果が発生する可能性があります。 鉄筋コントロールに対して Microsoft Active Accessibility を適切に実装することは困難です。 UI オートメーションは、ウィンドウの所有権によって課される階層にもかかわらず、ツリー内の任意の場所に要素を配置できるように、親の再親と再配置を有効にします。
役割とコントロール型
Microsoft Active Accessibility では、accRole プロパティ (IAccessible::get_accRole) を使用して、UI の要素ロールの説明 ( ROLE_SYSTEM_SLIDER や ROLE_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 オートメーションマップします。
状態とプロパティ
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 を示しています。
プロパティ ID の完全な一覧については、「 プロパティ識別子」を参照してください。
イベント
Microsoft Active Accessibility とは異なり、UI オートメーションのイベント メカニズムは、ウィンドウ ハンドルに密接に関連付けられている Windows イベント ルーティングに依存せず、クライアント アプリケーションでフックを設定する必要はありません。 イベントのサブスクリプションは、特定のイベントだけでなく、ツリーの特定の部分に合わせて微調整できます。 プロバイダーは、リッスンしているイベントを追跡することで、イベントの発生を微調整することもできます。
イベントがイベント コールバックに直接渡されるため、イベントを発生させる要素をクライアントが取得する方が簡単です。 クライアントがイベントをサブスクライブしたときにキャッシュ要求が指定された場合、要素のプロパティは自動的にプリフェッチされます。
次の表は、Microsoft Active Accessibility イベント定数とUI オートメーションイベント ID の対応を示しています。
UI オートメーションからアクティブなアクセシビリティ プロパティとオブジェクトにアクセスする
Microsoft Active Accessibility で使用できないUI オートメーションの主な機能は、1 回のクロスプロセス操作で複数のプロパティをフェッチできることです。
既存の Microsoft Active Accessibility クライアントは、 IUIAutomationLegacyIAccessiblePattern インターフェイスを使用することで、この機能を利用できます。 このインターフェイスは、UI 要素で Microsoft Active Accessibility のプロパティとメソッドを公開する コントロール パターン を表します。 要素を取得するときに、アプリケーションは、このコントロール パターンとそのプロパティをキャッシュすることを要求できます。
IUIAutomationLegacyIAccessiblePattern を使用すると、クライアントは IAccessible のネイティブ サポートを持たない要素から Microsoft Active Accessibility プロパティを取得することもできます。
IUIAutomationLegacyIAccessiblePattern のプロパティを変更した場合、UI オートメーションイベントは発生しません。
関連トピック