アクティブなアクセシビリティ サーバーへのUI オートメーション機能の追加

Microsoft UI オートメーション プロバイダーを持たないが、IAccessible を実装するコントロールは、IAccessibleEx インターフェイスを実装することで、いくつかのUI オートメーション機能を提供するように簡単アップグレードできます。 このインターフェイスを使用すると、IRawElementProviderFragment などのUI オートメーション プロバイダー インターフェイスの完全な実装を必要とせずに、コントロールUI オートメーションプロパティとコントロール パターンを公開できます。 IAccessibleEx を実装するには、ベースラインの Microsoft Active Accessibility オブジェクト階層にエラーや不整合 (親オブジェクトが子として一覧表示されない子オブジェクトなど) を含めず、UI オートメーション仕様と競合しないようにする必要があります。 Microsoft Active Accessibility オブジェクト階層がこれらの要件を満たしている場合は、IAccessibleEx を使用して機能を追加することをお勧めします。それ以外の場合は、UI オートメーション単独で、または Microsoft Active Accessibility の実装と共に実装する必要があります。

範囲の値を持つカスタム コントロールの大文字と小文字を区別します。 コントロールの Microsoft Active Accessibility サーバーは、そのロールを定義し、現在の値を返すことが可能ですが、これらのプロパティは Microsoft Active Accessibility で定義されていないため、コントロールの最小値と最大値を返す手段がありません。 UI オートメーション クライアントは、コントロールのロール、現在の値、およびその他の Microsoft Active Accessibility プロパティを取得できます。これは、UI オートメーション コアが IAccessible を介して取得できるためです。 ただし、オブジェクトの IRangeValueProvider インターフェイスにアクセスしないと、UI オートメーションも最大値と最小値を取得できません。

コントロール開発者は、コントロールに完全なUI オートメーション プロバイダーを提供できますが、これは、ナビゲーションや共通プロパティなど、IAccessible 実装の既存の機能の多くを複製することを意味します。 代わりに、開発者は IRangeValueProvider を使用してコントロール固有のプロパティのサポートを追加しながら、引き続き IAccessible に依存してこの機能を提供できます。

カスタム コントロールを更新するには、次のメイン手順が必要です。

  • このオブジェクトまたは別のオブジェクトで IAccessibleEx インターフェイスを見つけることができるように、アクセス可能なオブジェクトに IServiceProvider を実装します。
  • アクセス 可能なオブジェクトに IAccessibleEx を実装します。
  • Microsoft Active Accessibility の子項目に対して個別のアクセシビリティ 対応オブジェクトを作成します。このオブジェクトは、Microsoft Active Accessibility で親オブジェクトの IAccessible インターフェイス (リスト アイテムなど) によって表されている可能性があります。 これらのオブジェクトに IAccessibleEx を実装します。
  • アクセス可能なすべてのオブジェクトに IRawElementProviderSimple を実装します。
  • アクセス可能なオブジェクトに適切なコントロール パターン インターフェイスを実装します。

このトピックは、次のセクションで構成されています。

IAccessibleEx の公開

コントロールの IAccessibleEx の実装は別のオブジェクトに存在する可能性があるため、クライアント アプリケーションはこのインターフェイスを取得するために QueryInterface に依存できません。 代わりに、クライアントは IServiceProvider::QueryService を呼び出す必要があります。 このメソッドの次の実装例では、 IAccessibleEx が別のオブジェクトに実装されていないと想定されています。したがって、メソッドは 単に QueryInterface を呼び出します。

HRESULT CListboxAccessibleObject::QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject)
{
    if (!ppvObject)
    {
        return E_INVALIDARG;
    }
    *ppvObject = NULL;
    if (guidService == __uuidof(IAccessibleEx))
    {
        return QueryInterface(riid, ppvObject);
    }
    else 
    {
        return E_INVALIDARG;
    }
};

IAccessibleEx の実装

最も関心のある IAccessibleEx のメソッドは GetObjectForChild です。 このメソッドは、Microsoft Active Accessibility サーバーに、子アイテムのアクセシビリティ対応オブジェクト (少なくとも IAccessibleEx を公開するオブジェクト) を作成する機会を提供します。 Microsoft Active Accessibility では、子項目は通常、アクセス可能なオブジェクトとしてではなく、アクセス可能なオブジェクトの子として表されます。 ただし、UI オートメーションでは各要素を個別のアクセス可能なオブジェクトで表す必要があるため、GetObjectForChild では、必要に応じて子ごとに個別のオブジェクトを作成する必要があります。

次の実装例は、カスタム リスト ビュー内のアイテムに対してアクセス可能なオブジェクトを返します。

HRESULT CListboxAccessibleObject::GetObjectForChild(long idChild, IAccessibleEx **pRetVal)
{ 
    *pRetVal = NULL;
    VARIANT vChild;
    vChild.vt = VT_I4;
    vChild.lVal = idChild;

    // ValidateChildId is an application-defined function that checks whether
    // the child ID is valid. This is similar to code that validates the varChild
    // parameter in IAccessible methods.
    //
    // Additionally, if this idChild corresponds to a child that has its own
    // IAccessible, we should also return E_INVALIDARG here. (The caller
    // should instead be using the IAccessibleEx from that child's own
    // IAccessible in that case.)
    if (idChild == CHILDID_SELF || FAILED(ValidateChildId(vChild)))
    {
        return E_INVALIDARG;
    }

    // Return a suitable provider for this specific child.
    // This implementation returns a new instance each time; an implementation
    // can cache these if desired.

    // _pListboxControl is a member variable pointer to the owning control.
    IAccessibleEx* pAccEx  = new CListItemAccessibleObject(idChild, _pListboxControl);
    if (pAccEx == NULL)
    {
        return E_OUTOFMEMORY;
    }
    *pRetVal = pAccEx;
    return S_OK; 
}

完全なサンプル実装については、MSDN の「カスタム コントロールをアクセシビリティ対応にするパート 5: IAccessibleEx を使用したカスタム コントロールへのUI オートメーションサポートの追加」を参照してください。

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