MSAA ウィンドウレス ActiveX コントロールをホストする方法
Microsoft Active Accessibility を実装するウィンドウレスの Microsoft ActiveX コントロールをホストできるコントロール コンテナーを作成する方法について説明します。 ここで説明する手順に従うことで、コントロール コンテナーでホストされている Microsoft Active Accessibility ベースのウィンドウレス コントロールに、支援テクノロジ (AT) クライアント アプリケーションからアクセスできることを確認できます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Microsoft Win32 およびコンポーネント オブジェクト モデル (COM) プログラミング
- ウィンドウレス ActiveX コントロール
- Microsoft Active Accessibility servers
Instructions
手順 1: ウィンドウレス コントロールの代わりにルート IAccessible インターフェイスを指定します。
システムがウィンドウレス コントロールのルートに IAccessible ポインターを必要とするたびに、システムはコントロール コンテナーに対してクエリを実行します。 ポインターを取得するために、コンテナーはウィンドウレス コントロールの IServiceProvider::QueryService メソッドの実装を呼び出します。
コントロール コンテナーに Microsoft Active Accessibility 実装がある場合は、ウィンドウレス コントロールの IAccessible ポインターをシステムに返すことができます。
コントロール コンテナーに Microsoft UI オートメーション実装がある場合は、UiaProviderFromIAccessible 関数を呼び出して、コントロールを表す IRawElementProviderSimple インターフェイス ポインターを取得し、IRawElementProviderSimple インターフェイス ポインターをシステムに返します。
手順 2: ウィンドウレス コントロールの代わりに、WM_GETOBJECT メッセージに応答します。
ウィンドウレス コントロールによって発生した WinEvent にクライアント アプリケーションが応答すると、コントロール コンテナーはコントロールの代わりに WM_GETOBJECT メッセージを受け取ります。 メッセージには、イベントを発生させたウィンドウレス コントロールのオブジェクト ID が含まれます。
コントロール コンテナーは、オブジェクト ID を "所有" するウィンドウレス コントロールを調べることで応答し、そのコントロールの IAccessibleHandler::AccessibleObjectFromID メソッドを呼び出します。 AccessibleObjectFromID メソッドは UI 項目の IAccessible インターフェイス ポインターを返し、コントロール コンテナーはシステムへのポインターを返し、クライアント アプリケーションに転送します。
手順 3: IAccessibleWindowlessSite インターフェイスを実装する。
IAccessibleWindowlessSite::GetParentAccessible メソッドを実装します。
クライアント アプリケーションでウィンドウレス コントロールのルート プロバイダーの親に関するアクセシビリティ情報が必要な場合、システムはウィンドウレス コントロールの IAccessible::get_accParent メソッドを 呼び出します。 コントロールは、ウィンドウレス コントロールの親の IAccessible ポインターを提供する、コントロール コンテナーの IAccessibleWindowlessSite::GetParentAccessible メソッドを呼び出すことによって応答します。
IAccessibleWindowlessSite::AcquireObjectIdRange、QueryObjectIdRange、ReleaseObjectIdRange メソッドを実装します。
コントロール コンテナーでは、オブジェクト ID 範囲とウィンドウレス コントロールのマッピングを維持する必要があります。 マッピングにより、コントロール コンテナーは、オブジェクト ID に対する特定の要求に応答する必要があるコントロールを識別できます。 次の表は、オブジェクト ID 範囲をウィンドウレス コントロールにマッピングする例を示しています。
範囲ベース 範囲のサイズ コントロール 1000 500 コントロール 1 1500 1000 コントロール 2 2500 2000 コントロール 1 コントロール コンテナーは、オブジェクト ID 範囲と、それ自体およびすべてのウィンドウなしの子のウィンドウなしのコントロールとのマッピングを維持する必要があります。 オブジェクト ID の範囲は、互いに隣接している必要はありません。 また、サービス拒否攻撃を回避するために、コントロール コンテナーは、特定のコントロールに付与される範囲の数に制限を設定できます。 ただし、コントロールごとに複数の範囲を許可して、コントロールを拡張できるようにすると便利です。
手順 4: 省略可能: IAccessibleHostingElementProviders インターフェイスを実装します。
コントロール コンテナーに Microsoft Active Accessibility サーバーの実装があり、サーバーが、UI オートメーションをサポートするウィンドウレス ActiveX コントロールを含むアクセシビリティ ツリーのルートである場合は、IAccessibleHostingElementProviders インターフェイスを実装します。 IAccessibleHostingElementProviders インターフェイスには、単一のメソッド GetEmbeddedFragmentRoots があり、コントロール コンテナーによってホストされているすべてのUI オートメーションウィンドウレス ActiveX コントロールの IRawElementProviderFragmentRoot インターフェイス ポインターを取得します。
関連トピック