MSAA を使用してウィンドウレス ActiveX コントロールにアクセスできるようにする
Microsoft Active Accessibility API を使用して、ウィンドウレスの Microsoft ActiveX コントロールが支援技術 (AT) クライアント アプリケーションから確実にアクセスできるようにする方法について説明します。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Microsoft Win32 およびコンポーネント オブジェクト モデル (COM) プログラミング
- ウィンドウレス ActiveX コントロール
- Microsoft Active Accessibility サーバー
Instructions
手順 1: IAccessible インターフェイスを実装する。
ウィンドウレス ActiveX コントロールにアクセスできるようにするには、次の手順で説明する場合を除き、ウィンドウ ベースのコントロールの場合と同様に、Microsoft Active Accessibility IAccessible インターフェイスを実装する必要があります。 IAccessible の実装の詳細については、「Active Accessibility Servers の開発者ガイド」を参照してください。
手順 2: IServiceProvider インターフェイスを実装する。
クライアントがウィンドウレス コントロールに関するアクセシビリティ情報を要求すると、コンテナーはコントロールの IServiceProvider::QueryService メソッドを呼び出して 、IAccessible インターフェイス ポインターを取得します。
この例では、 QueryService メソッドを実装する方法を示します。
STDMETHODIMP CMyAccessibleMSAAControl::QueryService(REFGUID guidService,
REFIID riid, void **ppvObject)
{
if (ppvObject == NULL)
{
return E_INVALIDARG;
}
*ppvObject = NULL;
HRESULT hr = E_FAIL;
if (guidService == __uuidof(IAccessible))
{
hr = QueryInterface(riid, ppvObject);
}
return hr;
}
手順 3: コントロール サイトの IAccessibleWindowlessSite::GetParentAccessible メソッドへの IAccessible::get_accParent メソッド呼び出しを委任する。
クライアントがウィンドウレス コントロールの親オブジェクトを要求すると、コンテナーはコントロールの IAccessible::get_accParent メソッドを呼び出します。 get_accParent実装では、コンテナーの IAccessibleWindowlessSite::GetParentAccessible メソッドに委任する必要があります。
この例では、 get_accParent メソッドを実装する方法を示します。
HRESULT CMyAccessibleMSAAControl::get_accParent(IDispatch **ppdispParent)
{
if (ppdispParent == NULL)
{
return E_INVALIDARG;
}
HRESULT hr = S_FALSE;
*ppdispParent = NULL;
IAccessibleWindowlessSite *pWindowlessSite = NULL;
if (SUCCEEDED(m_pClientSite->QueryInterface(IID_PPV_ARGS(&pWindowlessSite))))
{
IAccessible *pParentAcc = NULL;
if (SUCCEEDED(pWindowlessSite->GetParentAccessible(&pParentAcc)))
{
hr = pParentAcc->QueryInterface(IID_PPV_ARGS(ppdispParent));
}
}
SafeRelease(&pWindowlessSite);
return hr;
}
手順 4: ウィンドウレス コントロールのイベント ソースに割り当てるオブジェクト ID の範囲を取得します。
ウィンドウ ベースのコントロールと同様に、ウィンドウレス ActiveX コントロールは NotifyWinEvent 関数を呼び出して、重要なイベントをクライアントに通知します。 関数パラメーターには、イベントを発生させるアイテムのオブジェクト ID が含まれます。 ウィンドウレス コントロールでは、コントロール サイトの IAccessibleWindowlessSite::AcquireObjectIdRange メソッドを呼び出して取得した範囲の値を使用して、オブジェクト ID を割り当てる必要があります。
この例では、コントロール コンテナーからオブジェクト ID 値の範囲を取得する方法を示します。
IAccessibleWindowlessSite *pWindowlessSite = NULL;
if (SUCCEEDED(m_pClientSite->QueryInterface(
IID_PPV_ARGS(&pWindowlessSite))))
{
if (FAILED(pWindowlessSite->AcquireObjectIdRange(100, this,
&m_idObjectBase)))
{
m_idObjectBase = -1;
}
}
SafeRelease(&pWindowlessSite);
手順 5: IAccessibleHandler インターフェイスを実装する。
ウィンドウレス コントロールが NotifyWinEvent 関数を呼び出すと、コントロールはイベントを発生させる UI 項目のオブジェクト ID を指定し、コントロールの代わりに WM_GETOBJECT メッセージに応答するウィンドウとしてコントロール コンテナーを指定します。
クライアント アプリケーションがイベントに応答すると、コントロール コンテナーは、イベントを発生させた UI 項目のオブジェクト ID を含む WM_GETOBJECT メッセージを受け取ります。 コントロール コンテナーは、オブジェクト ID を "所有" するウィンドウレス コントロールを参照し、そのコントロールの IAccessibleHandler::AccessibleObjectFromID メソッドを呼び出すことによって応答します。 AccessibleObjectFromID メソッドは、UI 項目の IAccessible インターフェイス ポインターを返し、コントロール コンテナーはポインターをクライアント アプリケーションに転送します。
関連トピック