次の方法で共有


Client-Side (プロキシ) UI オートメーション プロバイダーの実装

Microsoft UI オートメーション は、Microsoft Win32、Windows フォーム、Windows Presentation Foundation (WPF) アプリケーションで使用されるプロキシなど、ほとんどの標準コントロールに対して一連のプロキシを提供します。 ただし、多くのカスタム コントロールとサード パーティ製コントロールは、ネイティブ UI オートメーション プロバイダーを実装していません。 UI オートメーションクライアント アプリケーションからアクセスできるようにするには、これらのコントロールにクライアント側プロバイダー (プロキシ プロバイダーまたはプロキシとも呼ばれます) を提供する必要があります。

このトピックでは、サポートされていないコントロールのプロキシ プロバイダーを作成し、クライアント アプリケーションで使用されるプロキシの一覧に追加する方法について説明します。 次のトピックがあります。

プロキシ プロバイダーを実装する方法を示すコード例については、「UI オートメーション プロバイダーの方法に関するトピック」を参照してください。

プロキシとは

クライアント側プロバイダー (プロキシ) は、独自の IRawElementProviderSimple 実装を持たないコントロールに代わって IRawElementProviderSimple インターフェイスを実装するオブジェクトです。 プロキシがない場合、このようなコントロールはUI オートメーションに対してほとんど不透明であり、コントロールの場所など、ウィンドウ ハンドル (HWND) から使用可能な基本情報のみを提供できます。

プロキシ ファクトリとは

各プロキシには、対応する プロキシ ファクトリが必要です。これは、 IUIAutomationProxyFactory インターフェイスを公開するオブジェクトです。 UI オートメーションは、プロキシ ファクトリ エントリの内部テーブルを保持します。それぞれに、各プロキシのプロキシ ファクトリへの参照と一連の条件が含まれています。 UI オートメーションネイティブの IRawElementProviderSimple 実装を持たないコントロールが検出されると、そのコントロールがサポートされていることを示す条件を持つプロキシ ファクトリ エントリを検索します。 UI オートメーション最初からテーブルを検索し、一致するエントリが見つかると、UI オートメーションファクトリの IUIAutomationProxyFactory::CreateProvider メソッドを呼び出します。 一致するプロキシが正常に作成されると、UI オートメーションは検索を停止し、新しく作成されたプロキシ オブジェクトを使用します。それ以外の場合は、UI オートメーション検索を続行します。

クライアント アプリケーションは、 IUIAutomation::CreateProxyFactoryEntry メソッドを使用してプロキシ ファクトリ エントリのインスタンスを作成します。このメソッドは、 IUIAutomationProxyFactoryEntry インターフェイス ポインターを返します。 クライアントは 、IUIAutomationProxyFactoryEntry によって公開されるメソッドを使用して、プロキシ ファクトリがプロキシの作成に使用する条件のセットを指定します。

IUIAutomationProxyFactory::CreateProvider を呼び出すと、UI オートメーションは、プロキシ ファクトリ オブジェクトがカスタム コントロールを適切にサポートしているかどうかを判断するために使用できるパラメーターを渡します。 その場合、プロキシ ファクトリはプロキシのインスタンスを作成し、 IRawElementProviderSimple インターフェイス ポインターを返します。それ以外の場合は、 NULL ポインターを返します。

プロキシ ファクトリ マッピング

既定では、UI オートメーションはプロキシ ファクトリ テーブルを次の順序で検索します。

Order プロキシ 説明
1 Microsoft: 非制御プロキシ 正確なクラス名または基底クラス名 "ComboBoxEx32" を持つウィンドウの場合。
2 Microsoft: 非制御プロキシ 正確なクラス名または基底クラス名 "WorkerW" を持つウィンドウの場合。
3 Microsoft: 非制御プロキシ 正確なクラス名または基底クラス名が "SHELLDLL_DefView" のウィンドウの場合。
4 Microsoft: コンテナー プロキシ 正確なクラス名または基底クラス名 "#32770" を持つウィンドウの場合。
5 Microsoft: コンテナー プロキシ "AfxControlBar" を含むクラス名または基底クラス名を持つウィンドウの場合。
6 Microsoft: TreeView プロキシ "SysTreeView32" を含むクラス名または基本クラス名を持つウィンドウの場合。
7 Microsoft: ListView プロキシ "SysListView32" (1) を含むクラス名または基本クラス名を持つウィンドウの場合。
8 Microsoft: ListView プロキシ "SysListView32" (2) を含むクラス名または基本クラス名を持つウィンドウの場合。
9 Microsoft: MSAA プロキシ 任意のウィンドウの場合。

 

プロキシ 7 と 8 は、SysListView32 コントロールの重複するエントリです。 変更を加えることなく、プロキシ 7 は常に SysListView32 コントロールに使用され、プロキシ 8 は使用されません。 プロキシ 8 は、表示可能なリスト アイテムにのみ使用され、通常、表示される要素でのみ動作するクライアント アプリケーション、または厳密なパフォーマンス要件を持つクライアント アプリケーションで使用されます。 これらのクライアントは、プロキシ 7 を削除できます。

プロキシ 9 は、microsoft Active Accessibility to UI オートメーション プロキシであり、常にテーブルの最後のエントリである必要があります。 これにより、Microsoft Active Accessibility を実装するが、UI オートメーションを実装しないコントロールに対して Microsoft Active Accessibility フォールバック機能が有効になります。

プロキシ ファクトリ テーブルのエントリを変更する場合は、エントリの新しい位置を慎重に評価する必要があります。 カスタム プロキシのエントリは、コントロールプロキシとコンテナー プロキシ以外のプロキシの後に配置し、プロキシをUI オートメーションする Microsoft Active Accessibility の前に配置することをお勧めします。 また、CreateProvider の呼び出しでコードで特定のウィンドウ ハンドル (HWND) をサポートする必要があるかどうかを判断することもできますが、クラス名に基づいてプロキシを選択UI オートメーションし、CreateProvider メソッドの条件付きコードを最小限に抑える方が効率的です。

UI オートメーションは、クライアントごとに個別のプロキシ ファクトリ テーブルを保持します。 クライアントがプロキシ テーブルを変更すると、変更はクライアント自体にのみ影響します。他のクライアントは影響を受けません。

既定のプロキシの管理

クライアント アプリケーションが CUIAutomation オブジェクトを作成すると、プロキシ ファクトリ テーブルには、標準コントロールの既定のプロキシ プロバイダーのエントリのみが最初に含まれます。 IUIAutomationProxyFactoryMapping インターフェイスを使用すると、クライアントは新しいエントリの追加、不要なエントリの削除、エントリの順序の変更などを行うことができます。 クライアントは、 IUIAutomation::P roxyFactoryMapping メソッドを呼び出すことによって 、IUIAutomationProxyFactoryMapping インターフェイス ポインターを取得できます。

使用可能なプロキシのテーブルには、各プロキシの IUIAutomationProxyFactoryEntry インターフェイスが 含まれています。 各 IUIAutomationProxyFactoryEntry は、プロキシが提供する IUIAutomationProxyFactory とコントロール クラスを指定し、イベントの処理方法を定義します。

プロキシのテーブルは 、IUIAutomation::P roxyFactoryMapping プロパティから取得できる IUIAutomationProxyFactoryMapping インターフェイスによって表されます。 アプリケーションでは、 IUIAutomationProxyFactoryMapping メソッドを使用してプロキシを追加および削除できます。 このテーブルに追加する新しいエントリを作成するには、 IUIAutomation::CreateProxyFactoryEntry を使用してインターフェイスを取得し、 IUIAutomationProxyFactoryEntry メソッドを使用して、該当するコントロール クラスとプロキシの動作を定義します。

Client-Side (プロキシ) UI オートメーション プロバイダーを作成する方法

UI オートメーション プロバイダー プログラマ ガイド