UI オートメーションのウィンドウなし ActiveX コントロールをホストする
Microsoft UI オートメーションを実装するウィンドウレスの Microsoft ActiveX コントロールをホストできるコントロール コンテナーを作成する方法について説明します。 ここで説明する手順を使用すると、コントロール コンテナーでホストされているUI オートメーションウィンドウレス コントロールが支援技術 (AT) クライアント アプリケーションからアクセスできることを確認できます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Microsoft Win32 およびコンポーネント オブジェクト モデル (COM) プログラミング
- ウィンドウレス ActiveX コントロール
- UI オートメーション プロバイダー
Instructions
手順 1: ウィンドウレス コントロールの代わりに IRawElementProviderSimple インターフェイスを指定します。
システムがウィンドウレス コントロールのルートに IRawElementProviderSimple ポインターを必要とするたびに、システムはコントロール コンテナーに対してクエリを実行します。 ポインターを取得するために、コンテナーはウィンドウレス コントロールの IServiceProvider::QueryService メソッドの実装を呼び出します。
コントロール コンテナーにUI オートメーション実装がある場合は、ウィンドウレス コントロールの IRawElementProviderSimple ポインターをシステムに返すことができます。
コントロール コンテナーに Microsoft Active Accessibility 実装がある場合は、 UiaIAccessibleFromProvider 関数を呼び出して、コントロールを表す IAccessible インターフェイス ポインターを取得し、システムへの IAccessible インターフェイス ポインターを返します。
手順 2: IRawElementProviderWindowlessSite インターフェイスを実装します。
コントロール コンテナーは、IRawElementProviderWindowlessSite インターフェイスを実装して、UI オートメーション ベースのウィンドウレス コントロールがアクセシビリティ情報を伝達できるようにします。
IRawElementProviderWindowlessSite::GetRuntimeIdPrefix を実装します。
ウィンドウレス コントロール フラグメントは、それ自体に対して一意のランタイム ID を作成する必要があります。 ランタイム ID を作成するために、ウィンドウレス コントロール フラグメントは、コントロール サイトの GetRuntimeIdPrefix メソッドを呼び出してプレフィックス値を取得し、ウィンドウレス コントロール内の他のすべてのフラグメントに対して一意の整数値をプレフィックスに追加します。
ウィンドウレス コントロールのコントロール サイトでは、定数 UiaAppendRuntimeId を含む SAFEARRAY を作成し、その後にサイトに固有の整数値を指定することで、GetRuntimeIdPrefix メソッドを実装する必要があります。
この例では、ウィンドウレス コントロールのランタイム ID プレフィックスを返す方法を示します。
IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix( SAFEARRAY **ppsaPrefix) { if (ppsaPrefix == NULL) { return E_INVALIDARG; } // m_siteIndex is the index of the windowless control's // site. It is defined by the control container. int rId[] = { UiaAppendRuntimeId, m_siteIndex }; SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 0, 2); if (psa == NULL) { return E_OUTOFMEMORY; } for (LONG i = 0; i < 2; i++) { SafeArrayPutElement(psa, &i, (void*)&(rId[i])); } *ppsaPrefix = psa; return S_OK; }
IRawElementProviderWindowlessSite::GetAdjacentFragment メソッドを実装します。
UI オートメーションを実装するコントロールは、コントロールの親フラグメント プロバイダーへのポインターを返す必要があります。
フラグメントの親を返すには、 IRawElementProviderFragment インターフェイスを実装するオブジェクトが Navigate メソッドを実装できる必要があります。 ウィンドウレス コントロールでは、コントロールが親オブジェクトのアクセス可能なツリー内の位置を特定できない可能性があるため、 Navigate の実装は困難です。 IRawElementProviderWindowlessSite::GetAdjacentFragment メソッドを使用すると、ウィンドウレス コントロールは、隣接するフラグメントのサイトに対してクエリを実行し、そのフラグメントを Navigate を呼び出したクライアントに返すことができます。
この例では、コントロール コンテナーがウィンドウレス コントロールの親フラグメントを取得する方法を示します。
IFACEMETHODIMP CProviderWindowlessSite::GetAdjacentFragment( enum NavigateDirection direction, IRawElementProviderFragment **ppFragment) { if (ppFragment == NULL) { return E_INVALIDARG; } *ppFragment = NULL; HRESULT hr = S_OK; switch (direction) { case NavigateDirection_Parent: { IRawElementProviderSimple *pSimple = NULL; // Call an application-defined function to retrieve the // parent provider interface. hr = GetParentProvider(&pSimple); if (SUCCEEDED(hr)) { // Get the parent's IRawElementProviderFragment interface. hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment)); pSimple->Release(); } } break; case NavigateDirection_FirstChild: case NavigateDirection_LastChild: hr = E_INVALIDARG; break; // Ignore NavigateDirection_NextSibling and NavigateDirection_PreviousSibling // because there are no adjacent fragments. default: break; } return hr; }
手順 3: 省略可能: IRawElementProviderHostingAccessibles インターフェイスを実装します。
コントロール コンテナーに、Microsoft Active Accessibility をサポートするウィンドウレス ActiveX コントロールを含むアクセシビリティ ツリーのルートであるUI オートメーション プロバイダー実装がある場合は、IRawElementProviderHostingAccessibles インターフェイスを実装します。 IRawElementProviderHostingAccessibles インターフェイスには、コントロール コンテナーによってホストされているすべての Microsoft Active Accessibility ベースのウィンドウレス ActiveX コントロールの IAccessible インターフェイス ポインターを取得する GetEmbeddedAccessibles という 1 つのメソッドがあります。
関連トピック