UI オートメーション と Active Accessibility
Microsoft Active Accessibility は、Windows 95 で導入されたレガシー API であり、Windows アプリケーションをアクセス可能にするために設計されました。 Microsoft UI Automation は、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 Automation ほど多くの情報を公開しないため、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 回表示され、それらの要素から移動すると予期しない結果が生じる可能性があります。 Rebar コントロールに Microsoft Active Accessibility を適切に実装するのは困難です。 UI オートメーションにより、ウィンドウの所有権によって課せられた階層に関係なく、要素をツリー内の任意の場所に配置できるように、親の再設定と再配置が可能になります。
役割とコントロール型
Microsoft Active Accessibility は、accRole プロパティ (IAccessible::get_accRole) を使用して、 ROLE_SYSTEM_SLIDER や ROLE_SYSTEM_MENUITEM など、UI 内の要素ロールの説明を取得します。 要素の役割は、要素の機能を表す主要な鍵になります。 コントロールとの対話は、 IAccessible::accSelect や IAccessible::accDoDefaultAction などの固定メソッドを使用して実現されます。 クライアント アプリケーションと UI 間の対話は、 IAccessibleを通じて実行できるものに制限されます。
対照的に、UI オートメーションは、 IUIAutomationElement::CurrentControlType (または IUIAutomationElement::CachedControlType) プロパティによって記述される要素のコントロール タイプを、その予想される機能から切り離します。 機能は、特殊なインターフェイスの実装を通じてプロバイダーによってサポートされる、コントロール パターンによって決定されます。 コントロール パターンを組み合わせることで、特定の UI 要素でサポートされる機能の完全なセットを記述できます。 一部のプロバイダーでは、特定の制御パターンをサポートする必要があります。 たとえば、チェック ボックスのプロバイダーは、 Toggle コントロール パターンをサポートする必要があります。 他のプロバイダーは、制御パターンのセットの 1 つ以上をサポートする必要があります。 たとえば、ボタンは、Toggle または Invoke コントロール パターンのいずれかをサポートする必要があります。 さらに、制御パターンをサポートしないものもあります。 たとえば、移動、サイズ変更、またはドッキングできないペインにはコントロール パターンがありません。
UI オートメーションは、 UIA_CustomControlTypeId 定数によって識別され、IUIAutomationElement::CurrentLocalizedControlType (または IUIAutomationElement::CachedLocalizedControlType) プロパティによって記述できるカスタム コントロールをサポートします。
次の表は、Microsoft Active Accessibility オブジェクト ロール を UI Automation コントロール タイプにマッピングします。
状態とプロパティ
Microsoft Active Accessibility 要素は、共通のプロパティ セットをサポートします。 accState などの一部のプロパティでは、要素の役割に応じて異なる条件を記述する必要があります。 サーバーは、要素に関連しないプロパティであっても、プロパティを返す IAccessible のすべてのメソッドを実装する必要があります。
UI オートメーションは追加のプロパティを定義します。その一部は Microsoft Active Accessibility の状態に対応します。 一部のプロパティはすべての要素に共通ですが、その他のプロパティはコントロール タイプとコントロール パターンに固有です。 UI オートメーション プロバイダーは、無関係なプロパティを実装する必要はありませんが、サポートしていないプロパティに対して null 値を返すことができます。 UI オートメーション コア サービスは、既定のウィンドウ プロバイダーからいくつかのプロパティを取得でき、これらはプロバイダーによって明示的に実装されたプロパティと統合されます。
UI オートメーションでは、さらに多くのプロパティがサポートされるだけでなく、プロパティをキャッシュできるようにすることでパフォーマンスが向上します。
次の表は、2 つのモデルのいくつかのプロパティ間の対応を示しています。 UI オートメーション プロパティ ID の説明については、「オートメーション要素プロパティ ID」を参照してください。
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 の完全なリストについては、 プロパティ識別子を参照してください。
Events
Microsoft Active Accessibility とは異なり、UI Automation のイベント メカニズムは、ウィンドウ ハンドルに密接に関連付けられている Windows イベント ルーティングに依存せず、クライアント アプリケーションでフックを設定する必要もありません。 イベントへのサブスクリプションは、特定のイベントだけでなく、ツリーの特定の部分に合わせて微調整できます。 プロバイダーは、どのイベントがリッスンされているかを追跡することで、発生するイベントを微調整することもできます。
また、イベントを発生させる要素はイベント コールバックに直接渡されるため、クライアントがイベントを発生させる要素を取得することも簡単になります。 クライアントがイベントをサブスクライブしたときにキャッシュ要求が提供された場合、要素のプロパティは自動的にプリフェッチされます。
次の表は、Microsoft Active Accessibility イベント定数 と UI オートメーション イベント ID の対応を示しています。
UI オートメーションからアクティブなアクセシビリティ プロパティとオブジェクトにアクセスする
Microsoft Active Accessibility では利用できない UI Automation の重要な機能は、単一のプロセス間操作で複数のプロパティをフェッチできることです。
既存の Microsoft Active Accessibility クライアントは、 IUIAutomationLegacyIAccessiblePattern インターフェイスを使用してこの機能を利用できます。 このインターフェイスは、UI 要素の Microsoft Active Accessibility プロパティとメソッドを公開する コントロール パターン を表します。 要素を取得するときに、アプリケーションはこのコントロール パターンとそのプロパティをキャッシュするように要求できます。
IUIAutomationLegacyIAccessiblePattern を使用すると、クライアントは IAccessible をネイティブにサポートしていない要素から Microsoft Active Accessibility プロパティを取得することもできます。
IUIAutomationLegacyIAccessiblePattern のプロパティを変更しても、UI Automation イベントは発生しません。