PDC 2008

IAccessibleEx インターフェイスを使用して既存の Microsoft Active Accessibility サーバーに
UI オートメーションを追加する

更新日: 2009 年 4 月 28 日


ダウンロード

PDC08_IAccessibleEx_Interface_for_Adding_UI_Automation_to_Existing_Microsoft_Active_Accessibility_Servers_JPN.docx (Word 形式、63 KB)


目次:

  1. はじめに
  2. IAccessibleEx インターフェイス
  3. 実装
  4. 実装のサンプル シナリオ
    1. シナリオ 1: Microsoft Active Accessibility サーバーに対して IAccessibleEx インターフェイスを使用し UI オートメーションを実装する
    2. シナリオ 2: Microsoft Active Accessibility のインプロセス クライアントに対する IAccessibleEx インターフェイス
  5. まとめ
  6. 詳細情報

Masahiko Kaneko
Microsoft Corporation
2008 年 9 月

対象:

Windows® オペレーティング システム

要約:

IAccessibleEx インターフェイスでは、既存のアプリケーションをはじめから書き直すことなく、UI オートメーションをサポートできるように Microsoft Active Accessibility 実装の機能を拡張できます。このホワイト ペーパーは、アプリケーション開発者に向けて IAccessibleEx のインターフェイス、デザイン上の考慮事項、サンプル シナリオについて説明しています。

法的通知:

このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。
このドキュメントに記載されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したものです。変化する市場状況に対応する必要があるため、このドキュメントは、記載された内容の実現に関するマイクロソフトの確約とはみなされないものとします。また、発行以降に発表される情報の正確性に関して、マイクロソフトはいかなる保証もいたしません。
このホワイト ペーパーに記載された内容は情報の提供のみを目的としており、明示、黙示または法律の規定にかかわらず、これらの情報についてマイクロソフトはいかなる責任も負わないものとします。
お客様ご自身の責任において、 適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権をお客様に許諾するものではありません。
© 2008 Microsoft Corporation. All rights reserved.
Microsoft、MS-DOS、Windows、Windows NT、Windows Server、Windows Vista、Active Directory、ActiveSync、ActiveX、Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectShow、DirectSound、DirectX、Expression、FrontPage、HighMAT、Internet Explorer、JScript、Microsoft Press、MSN、Outlook、PowerPoint、SideShow、Silverlight、Visual Basic、Visual C++、Visual InterDev、Visual J++、Visual Studio、WebTV、Windows Media、Win32、Win32s、および Zune は米国 Microsoft Corporation の米国またはその他の国における登録商標または商標です。
記載されている会社名、製品名には、各社の商標のものもあります。


1. はじめに

IAccessibleEx インターフェイスにより、既存のアプリケーションをはじめから書き直すことなく、アプリケーションやユーザーフェイス インターフェイス (UI) ライブラリが UI オートメーションをサポートできるように Microsoft Active Accessibility 実装の機能を拡張できます。IAccessibleEx インターフェイスを使用することで、Microsoft Active Accessibility と UI オートメーションとの相違点のみを実装できます。

このホワイト ペーパーでは、アプリケーション、アクセシビリティ ツール、オートメーションの各開発者に向けて、IAccessibleEx インターフェイス、実装におけるデザイン上の考慮事項、およびサンプル シナリオについて説明します。

Windows Automation API 3.0、UI オートメーションおよび Microsoft Active Accessibility の技術的な基本事項については、Windows 7 SDK を参照してください。CoDe Focus Magazine(CoDe Focus Magazine) (英語) の記事「Windows Automation API 3.0 Overview」 (英語) では、プラットフォームやアーキテクチャの基本事項について解説しています。

ページのトップへ


2. IAccessibleEx インターフェイス

IAccessibleEx インターフェイスにより、既存の Microsoft Active Accessibility サーバーの実装に UI オートメーションのプロパティやコントロール パターンを追加できます。これは、IRawElementProviderSimple インターフェイスと IAccessibleEx インターフェイス向けに、Microsoft Active Accessibility サーバー固有のシナリオと仕様を定義することで実現されます。既存の Microsoft Active Accessibility サーバーの実装では、既存の実装で行われた作業を有効に活用できます。

IAccessibleEx は、アクセス可能な要素を UI オートメーション オブジェクトのオートメーション要素として扱う際に生じる、ChildId のような IAccessible ブリッジの問題など、あらゆる問題に対処します。

UI オートメーション クライアントの側からすると、MSAA-to-UIA (Microsoft Active Accessibility から UI オートメーションへの) プロキシ フレームワークは、IAccessibleEx 対応の Microsoft Active Accessibility サーバーを標準の UI オートメーション プロバイダーとして扱うことになります。UI オートメーション クライアントは、UI オートメーション クライアントの標準コードを実行する以外に余分な処理を行う必要がありません。

インプロセスで実行されている Microsoft Active Accessibility クライアントの場合、IAccessibleEx インターフェイスや IRawElementProviderSimple インターフェイスは、UI オートメーションのコントロール パターンやプロパティにアクセスできるようにし、UI 要素を表すインターフェイスとして使用されます。IRawElementProviderSimple インターフェイスと IAccessibleEx インターフェイスは、Microsoft Active Accessibility の同じアクセス可能なオブジェクトに実装され、オブジェクト間の移動には QueryInterface が使用されます。

アクセシビリティまたはオートメーション インターフェイスとして UI オートメーションをサポートするアプリケーションの場合、UIA-to-MSAA (UI オートメーションから Microsoft Active Accessibility への) ブリッジ フレームワークでは、IAccessibleEx インターフェイスと、ネイティブの UI オートメーション実装から変換されたレガシ Microsoft Active Accessibility インターフェイスを提供することになります。既に UI オートメーションをサポートしているアプリケーションでは、IAccessibleEx を実装する必要はありません。

要約すると以下のようになります。

  • 既存の Microsoft Active Accessibility の実装では、IRawElementProviderSimple がパターンとプロパティを公開し、IAccessibleExChildId のような問題に対処することをサポートします。
  • 既存の Microsoft Active Accessibility クライアントは、このように追加されたインターフェイスを使用して UI オートメーションのプロパティやパターンにアクセスできます。
  • IAccessibleEx 実装によって拡張された実装からのイベントを表す新たな WinEvents 定数が定義されます。
  • UI オートメーション クライアントは、MSAA-to-UIA プロキシ フレームワークを経由して IAccessibleEx 実装から UI オートメーションのパターンとプロパティを取得します。
  • UI オートメーション プロバイダーは、UIA-to-MSAA ブリッジ フレームワークに依存しないで IAccessibleEx をサポートできます。

ページのトップへ


3. 実装

既存の Microsoft Active Accessibility サーバーが IRawElementProviderSimple のような UI オートメーション プロバイダー インターフェイスをサポートするための第一歩は、IAccessibleEx を実装することです。このメリットは、IAccessible プロパティ、アクセス可能なオブジェクトのツリー構造、WinEvents などの既存のアクセス可能なオブジェクトの実装を再利用できる点です。新たなコードが追加されるのは、新しく公開する機能だけです。

a. IAccessibleEx インターフェイスを実装する前に

アプリケーションが既に相応の Microsoft Active Accessibility サーバーによって実行されている場合、IAccessibleEx は UI オートメーションのサポート方法として費用対効果の高い方法ですが、IAccessibleEx および UI オートメーション プロバイダー インターフェイスの実装前に、いくつか考慮が必要な事項があります。

  • Microsoft Active Accessibility のアクセス可能なオブジェクト階層のベースラインは、クリーンな状態にしなければなりません。

IAccessibleEx は、既存のアクセス可能なオブジェクト階層との問題を解決できません。オブジェクト モデル構造に問題がある場合、IAccessibleEx インターフェイスを実装する前に Microsoft Active Accessibility 内で問題を解決しておかなければなりません。

  • IAccessibleEx の実装は、Microsoft Active Accessibility と UI オートメーションの両方の仕様に準拠する必要があります。

実装後のオブジェクト モデルが Microsoft Active Accessibility と UI オートメーションの両方に準拠したモデルになるようにします。両方の仕様の下での動作を確認するツールが用意されています。

ページのトップへ

b. コントロール パターン: Microsoft Active Accessibility と UI オートメーションとの重複

以下のコントロール パターンは、Microsoft Active Accessibility の機能と重複しないため、IAccessibleEx 実装のものを使用できます。

  • Dock パターン
  • Expand Collapse パターン
  • Grid パターン
  • Grid Item パターン
  • Multiple View パターン
  • Range Value パターン
  • Scroll パターン
  • Scroll Item パターン
  • Synchronized Input パターン
  • Table パターン
  • Table Item パターン
  • Transform パターン

Range Value パターンと Transform パターンの場合、UI オートメーションのパターンと Microsoft Active Accessibility で、一部同じメソッドが重複します。たとえば、Microsoft Active Accessibility の accValueput_accValue、および Range Value パターンの Value()SetValue() を実装する必要があります。実装の内部では、Microsoft Active Accessibility のメソッドと UI オートメーションのメソッドのコードを共有できます。このように Microsoft Active Accessibility と UI オートメーション両方の実装を要件とする方法は、既存の Microsoft Active Accessibility クライアントから IAccessible インターフェイスを使用できる状態に維持しながら、パターン インターフェイスの部分的な実装を回避できます。

コントロールに以下のいずれかの役割がある場合、表中で対応する UI コントロール パターンは必要ありません。それ以外の場合、関連するパターンを明確にサポートしてください。

UI オートメーションのコントロール パターン Microsoft Active Accessibility の役割
Invoke パターン ROLE_SYSTEM_PUSHBUTTON
ROLE_SYSTEM_MENUITEM
ROLE_SYSTEM_BUTTONDROPDOWN
ROLE_SYSTEM_SPLITBUTTON
および accDefaultAction が NULL ではないすべての役割
Selection Item パターン ROLE_SYSTEM_LISTITEM
ROLE_SYSTEM_RADIOBUTTON
Selection パターン ROLE_SYSTEM_LIST
Toggle パターン ROLE_SYSTEM_CHECKBUTTON
Value パターン ROLE_SYSTEM_TEXT (読み取り専用ではない場合)
ROLE_SYSTEM_PROGRESSBAR
ROLE_SYSTEM_COMBOBOX
および accValue が NULL ではないときの他のすべての役割
Window パターン 最上位レベルの Win32 HWND で自動的にサポート


ページのトップへ

c. プロパティ: Microsoft Active Accessibility と UI オートメーションとの重複

以下の UI オートメーション プロパティには、Microsoft Active Accessibility に相当するプロパティがありません。これらの UI オートメーション プロパティは IAccessibleEx 実装のものを使用することができます。

  • AutomationId
  • AriaProperties
  • AriaRole
  • ClassName
  • ClickablePoint
  • ControllerFor
  • Culture
  • DescribedBy
  • FlowsTo
  • FrameworkId
  • IsContentElement
  • IsControlElement
  • IsDataValidForForm
  • IsRequiredForForm
  • ItemStatus
  • ItemType
  • LabeledBy
  • LocalizedControlType
  • Orientation

下表の UI オートメーション要素のプロパティは Microsoft Active Accessibility のプロパティと重複するため、以下の例外を除いて IAccessibleEx 実装のものを使用できます。

  • AcceleratorKey と AccessKey: Microsoft Active Accessibility の accKeyboardShortcut プロパティと重複しますが、コントロールがアクセス キーとアクセラレータ (ショートカット キー) の両方を持つ場合には提供することができます。
  • ControlType: Microsoft Active Accessibility の accRole プロパティと重複しますが、より詳細なコントロール タイプ情報を提供するように指定できます。

Microsoft Active Accessibility のプロパティが対応している、UI オートメーション要素のプロパティを下表にまとめます。これらのプロパティについては、IAccessibleEx 実装のものを使用する必要はありません。

UI オートメーションのプロパティ Microsoft Active Accessibility のプロパティ
Rect BoundingRectangle accLocation
bool HasKeyboardFocu accState, STATE_SYSTEM_FOCUSED
bool IsEnabled accState, STATE_SYSTEM_UNAVAILABLE
bool IsKeyboardFocusable accState, STATE_SYSTEM_FOCUSABLE
bool IsPassword accState, STATE_SYSTEM_PROTECTED
string HelpText accHelp
string Name accName
int NativeWindowHandle WindowFromAccessibleObject
bool IsOffscreen accState, STATE_SYSTEM_INVISIBLE/OFFSCREEN
int ProcessId コア UIA が提供 UIA
int [] RuntimeId コア UIA が提供 UIA

ページのトップへ

d. イベントおよび WM_GETOBJECT メッセージ

IAccessibleEx を使って Microsoft Active Accessibility の実装を拡張する際には、Microsoft Active Accessibility のサーバーとクライアントがイベントを処理するのと同じ方法で、イベントが発生して処理されます。

IAccessibleEx 用に定義されたイベントに加えて、IAccessibleEx の実装には、以下の UI オートメーションのイベント ID を使用できます。

UI オートメーションのイベント Microsoft Active Accessibility のイベント
IsEnabledPropertyChangedEvent EVENT_OBJECT_STATECHANGE
ItemStatusPropertyChangedEvent 該当なし
ExpandCollapseExpandCollapseStatePropertyChangedEvent EVENT_OBJECT_STATECHANGE
MultipleViewCurrentViewPropertyChangedEvent 該当なし
ScrollHorizontallyScrollablePropertyChangedEvent 該当なし
ScrollHorizontalViewSizePropertyChangedEvent 該当なし
ScrollVerticallyScrollablePropertyChangedEvent 該当なし
ScrollVerticalViewSizePropertyChangedEvent 該当なし
ToggleToggleStatePropertyChangedEvent EVENT_OBJECT_STATECHANGE
ScrollHorizontalScrollPercentPropertyChangedEvent EVENT_OBJECT_CONTENTSCROLLED
ScrollVerticalScrollPercentPropertyChangedEvent EVENT_OBJECT_CONTENTSCROLLED

MSAA EVENT_OBJECT_<value> が関連付けられたイベントの場合、IAccessibleEx 実装では表中の UI オートメーション イベントに加えて、この関連付けられたイベントも発生させる必要があります。これによって IAccessible クライアントはイベントを受け取ることができますが、詳細情報を他のクライアントと通信することにもなります。

ページのトップへ


4. 実装のサンプル シナリオ

IAccessibleEx の実装と使用には難しい作業が必要になることも確かです。そこで、アプリケーション開発者とアクセシビリティ クライアント向けのサンプル シナリオを以下に 2 つ紹介します。

a. シナリオ 1: Microsoft Active Accessibility サーバーに対して IAccessibleEx インターフェイスを使用し UI オートメーションを実装する

最初のシナリオでは、IAccessibleExIRawElementProviderSimple を使用して Microsoft Active Accessibility 実装サーバーから UI オートメーション情報を公開します。

1. IServiceProvider インターフェイスを実装する

プロバイダーに対する最初の手順として、既存の IAccessible オブジェクトに IServiceProvider を実装します。サービス ID が __uuidof(IAccessibleEx) であるサービスに対する QueryService への着信呼び出しは、IAccessibleEx を実装するオブジェクトへの参照を返します。

2. ChildId を実装する

Microsoft Active Accessibility では、UI 要素が常に IAccessible COM インターフェイスと ChildId オブジェクト識別子のペアで識別されます。つまり、1 つの IAccessible COM オブジェクトが複数の UI 要素を表現できます。

1 つの IAccessibleEx インスタンスが 1 つの UI 要素を表すため、このインスタンスが IAccessibleChildId のペアから対応する IAccessibleEx へのマッピングを行います。IAccessibleEx には、このマッピングを処理する 2 つのメソッドが含まれています。

  • GetObjectForChild: 指定した子要素の IAccessibleEx 要素を返します。実装が ChildId を使用しない場合、指定した子要素に IAccessibleEx がない場合、または既に子要素が表されている場合は、S_OK または NULL を返します。
  • GetIAccessiblePair: IAccessibleEx 要素の IAccessibleChildId のペアを返します。ChildId を使用しない IAccessible 実装では、対応する IAccessible オブジェクトと CHILDID_SELF を返します。

アクセス可能なオブジェクトの実装で ChildId を使用しない場合でも、これらのメソッドは依然として下記の例のように実装することができます。

// このサンプルでは、同一オブジェクトに IAccessibleEx を実装しますが、

// ティアオフ オブジェクトや内部オブジェクトを使用することもできます。

class MyAccessibleImpl: public IAccessible,

                    public IAccessibleEx,

                    public IRawElementProviderSimple

{

public:

...

HRESULT STDMETHODCALLTYPE GetObjectForChild( long idChild, IAccessibleEx ** pRetVal )

{

    // この実装では ChildID はサポートしません。

    *pRetVal = NULL;

    return S_OK;

}



HRESULT STDMETHODCALLTYPE GetIAccessiblePair( IAccessible ** ppAcc, long * pidChild )

{

    // ここでは IAccessibleEx が IAccessible と同じオブジェクトに

    // 実装されていると想定しています。

    *ppAcc = static_cast&lt;IAccessible *&gt;(this);

    (*ppAcc)-&gt;AddRef();

    *pidChild = CHILDID_SELF;

    return S_OK;

}</code></pre>

ページのトップへ

3. IRawElementProviderSimple インターフェイスを実装する

サーバーでは IRawElementProviderSimple を使って UI オートメーションのプロパティとコントロール パターンに関する情報を公開します。IRawElementProviderSimple には以下のメソッドがあります。

  • ProviderOptions: IAccessibleEx 実装では使用されません。
  • GetPatternProvider: コントロール パターン インターフェイスを公開するために使用されます。指定したコントロール パターンをサポートするオブジェクト、またはコントロール パターンがサポートされない場合は NULL 値を返します。
  • GetPropertyValue: UI オートメーションのプロパティ値を公開するために使用されます。
  • HostRawElementProvider: IAccessibleEx 実装では使用されません。

IAccessibleEx サーバーは、IRawElementProviderSimple::GetPatternProvider を実装することによりコントロール パターンを公開します。このメソッドはコントロール パターンを指定する整数型のパラメーターを受け取ります。パターンがサポートされない場合、サーバーは NULL を返します。コントロール パターン インターフェイスがサポートされている場合、サーバーは IUnknown を返し、続いてクライアントが QueryInterface を呼び出して適切なコントロール パターンを取得します。

IAccessibleEx サーバーは、IRawElementProviderSimple::GetPropertyValue を実装し、プロパティをパラメーターとして識別できる PROPERTYID 整数値を指定することにより、LabeledByIsRequiredForForm などの UI オートメーションのプロパティをサポートできます。この技法は、コントロール パターン インターフェイスに含まれない UI オートメーション プロパティにのみ適用されます。一方、コントロール パターン インターフェイスと関連付けられたプロパティは、コントロール パターン インターフェイスのメソッドを通じて公開されます。たとえば、SelectionItem コントロール パターンからの IsSelected プロパティは、ISelectionItemProvider::get_IsSelected で公開されることになります。

ChildId で表される子オブジェクトが Microsoft Active Accessibility 実装のベースラインに含まれている場合、IRawElementProviderSimple の対応する実装が IAccessibleChildId のペア (Microsoft Active Accessibility のアクセス可能なオブジェクト) にマップされるように、IAccessibleEx を通じて両者間の差異を正確に処理してください。

UI オートメーション プロパティ、イベント、およびコントロール パターンの ID はすべて、Windows 7 SDK に付属する UIAutomation.h 内で定義されています。

ページのトップへ

b. シナリオ 2: Microsoft Active Accessibility のインプロセス クライアントに対する IAccessibleEx インターフェイス

この 2 つ目のサンプル シナリオでは、Microsoft Active Accessibility サーバーが既に存在し、IAccessible クライアントがインプロセスで実行されていると想定した場合の手順とサンプルを提供します。また、アクセシビリティ フレームワーク API の AccessibleObjectFromEventAccessibleObjectFromPoint、または AccessibleObjectFromWindow のいずれかを使用して IAccessible オブジェクトを既に取得している状態であるとします。

1. IAccessible インターフェイスから IAccessibleEx インターフェイスを取得する

  1. IID が __uuidof(IServiceProvider) となっている 元の IAccessible オブジェクトで QueryInterface を呼び出します。
  2. IServiceProvider::QueryService を呼び出して IAccessibleEx を取得します。

2. ChildId を処理する

クライアントでは、サーバーに対する ChildId 値を CHILDID_SELF 以外の値で準備する必要があります。クライアントは IAccessible から IAccessibleEx を取得した後、ChildId 値が CHILDID_SELF ではない (つまり親オブジェクトを示す) 場合に GetObjectForChild を呼び出す必要があります。

以下のコードに IAccessible オブジェクトと ChildId のペアに対する IAccessibleEx の取得方法を示します。

HRESULT GetIAccessibleExFromIAccessible( IAccessible * pAcc, long idChild,
                                     IAccessibleEx ** ppaex )

{

*ppaex = NULL;



// まず、IAccessible から IServiceProvider を取得します。

IServiceProvider * pSp = NULL;

HRESULT hr = pAcc-&gt;QueryInterface( IID_IServiceProvider, (void **) &amp; pSp );

if(FAILED(hr))

    return hr;

if(pSp == NULL)

    return E_NOINTERFACE;



// 次に、親オブジェクトの IAccessibleEx を取得します。

IAccessibleEx * paex = NULL;

hr = pSp-&gt;QueryService(__uuidof(IAccessibleEx), __uuidof(IAccessibleEx),

                                                             (void **)&amp;paex);

pSp-&gt;Release();

if(FAILED(hr))

    return hr;

if(paex == NULL)

    return E_NOINTERFACE;



// これが CHILDID_SELF に対するものであれば、これで完了です。それ以外の場合、

// 子 ID が必要です。これをオブジェクトに要求します。

if(idChild == CHILDID_SELF)

{

    *ppaex = paex;

    return S_OK;

}

else

{

    // 指定した idChild の IAccessibleEx を取得します。

    IAccessibleEx * paexChild = NULL;

    hr = paex-&gt;GetObjectForChild(idChild, &amp;paexChild);

    paex-&gt;Release();

    if(FAILED(hr))

        return hr;

    if(paexChild == NULL)

        return E_NOINTERFACE;

    *ppaex = paexChild;

    return S_OK;

}

}

ページのトップへ

3. IRawElementProviderSimple インターフェイスを取得する

クライアントに IAccessibleEx インターフェイスがある場合、以下の例のように QueryInterface を使用して、IRawElementProviderSimple インターフェイスを取得できます。

HRESULT GetIRawElementProviderFromIAccessible( IAccessible * pAcc, long idChild,
                                           IRawElementProviderSimple ** ppEl )

{

* ppEl = NULL;



// まず、IAccessible/idChild のペアに対する IAccessibleEx を取得します。

IAccessibleEx * paex;

HRESULT hr = GetIAccessibleExFromIAccessible( pAcc, idChild, &amp;paex );

if(FAILED(hr))

    return hr;



// 次に、QueryInterface を使用します。

hr = paex-&gt;QueryInterface(__uuidof(IRawElementProviderSimple), (void **)ppEl);

paex-&gt;Release();

return hr;

}

ページのトップへ

4. コントロール パターンを使用する

クライアントが IRawElementProviderSimple へのアクセスを確立すると、以下の例に示すように、プロバイダーに実装されているコントロール パターンのインターフェイスを取得することができます。クライアントはこれらのインターフェイスのメソッドを呼び出すことができます。

// IAccessible/idChild のペアからパターン インターフェイスを取得するためのヘルパー。

// IAccessibleEx を取得してから、GetPatternObject と QueryInterface を呼び出します。

HRESULT GetPatternFromIAccessible( IAccessible * pAcc, long idChild,

                               PATTERNID patternId, REFIID iid, void ** ppv )

{

// まず、IAccessible/idChild のペアに対する IAccessibleEx を取得します。

IRawElementProviderSimple * pel;

HRESULT hr = GetIRawElementProviderSimpleFromIAccessible( pAcc, idChild, &amp;pel );

if(FAILED(hr))

    return hr;

if(paex == NULL)

    return E_NOINTERFACE;



// ここでパターン オブジェクトを取得します。

IUnknown * pPatternObject = NULL;

hr = pel-&gt;GetPatternProvider(patternId, &amp;pPatternObject);

pel-&gt;Release();

if(FAILED(hr))

    return hr;

if(pPatternObject == NULL)

    return E_NOINTERFACE;



// 最後に、QueryInterface によって正しいインターフェイス タイプを問い合わせます。

hr = pPatternObject-&gt;QueryInterface(iid, ppv);

pPatternObject-&gt;Release();

if(*ppv == NULL)

    return E_NOINTERFACE;

return hr;

}

HRESULT CallInvokePatternMethod( IAccessible * pAcc, long idChild )

{

IInvokeProvider * pPattern;

HRESULT hr = GetPatternFromIAccessible(pAcc, varChild,

                                      UIA_InvokePatternId, __uuidof(IInvokeProvider),

                                      (void **)&amp;pPattern);

if(FAILED(hr))

    return hr;



hr = pPattern-&gt;Invoke();

pPattern-&gt;Release();

return hr;

}

ページのトップへ

5. プロパティ値を取得する

クライアントから IRawElementProviderSimple にアクセスできるようになったら、コントロール パターンを取得できるだけでなく、プロパティ値にもアクセスできるようになります。次のサンプル コードでは AutomationId (文字列) や LabeledBy (別の要素への参照) といった UI オートメーション プロパティの値を取得する方法を示します。

#include <initguid.h>

#include <uiautomationcoreapi.h> // UI オートメーション プロパティの GUID 定義をインクルードします。

#include <uiautomationcoreids.h> // パターンとプロパティ ID の定義をインクルードします。

// ここでは IRawElementProviderSimple * pEl: を既に取得していると想定します。

VARIANT varValue;

// AutomationId プロパティを取得します。

varValue.vt = VT_EMPTY;

HRESULT hr = pEl->GetPropertyValue(UIA_AutomationIdPropertyId, &varValue);

if(SUCCEEDED(hr))

{

if(varValue.vt == VT_BSTR)

{

    // AutomationId は varValue.bstrVal です。

}

VariantClear(&amp;varValue);

}

// LabeledBy プロパティを取得します。

varValue.vt = VT_EMPTY;

hr = pEl->GetPropertyValue(UIA_LabeledByPropertyId, &varValue);

if(SUCCEEDED(hr))

{

if(varValue.vt == VT_UNKNOWN || varValue.punkVal != NULL)

{

    // QueryInterface により IRawElementProviderSimple に問い合わせを行います。

    IRawElementProviderSimple * pElLabel = NULL;

    hr = varValue.punkVal-&gt;QueryInterface(__uuidof(IRawElementProviderSimple),

                                          (void**)&amp; pElLabel);

    if(pElLabel != NULL)

    {

        // ここで pElLabel を使用します。

        pElLabel -&gt;Release();

    }

}

VariantClear(&amp;varValue);

}

ここで紹介したサンプル コードは、コントロール パターンと関連付けられていないプロパティに適用されます。コントロール パターンのプロパティの場合は、クライアントがコントロール パターン インターフェイスへのアクセスを確立した後、そのインターフェイスでプロパティ値を要求できます。

ページのトップへ

6. IRawElementProviderSimple インターフェイスから IAccessible インターフェイスに逆変換する

UIA_LabeledByPropertyId を指定して GetPropertyValue を呼び出すか、IRawElementProviderSimpleSAFEARRAY を返す ISelectionProvider::GetSelection メソッドを使用してクライアントが IRawElementProviderSimple をプロパティ値として取得すると、IAccessible プロパティの取得を可能にする IAccessible を取得できます。この IAccessibleIRawElementProviderSimple に対応します。

  • まず、IAccessibleEx に対して QueryInterface を実行します。
  • QueryInterface が失敗した場合、本来プロパティが取得される IAccessibleEx インスタンスの ConvertReturnedElement を使用します。
  • 次に、この新しい IAccessibleExGetIAccessiblePair メソッドを使用して、IAccessibleChildId 値を取得します。
// IRawElementProviderSimple * pVal: プロパティまたはメソッドによって、

// 別の IRawElementProviderSimple から返される要素です。

IAccessible * pAcc = NULL;

long idChild;

// まず、IAccessibleEx に対して QueryInterface 実行します。

IAccessibleEx * pAccEx = pVal->QueryInterface(__uuidof(IAccessibleEx));

if(!pAccEx)

{

// QueryInterface が失敗し、IRawElementProviderSimple がプロパティまたは

// 別の IRawElementProviderSimple から返された値として取得された場合、

// その値を、取得元の要素の IAccessibleEx.ConvertReturnedValue に渡します。

pAccExOrig-&gt;ConvertReturnedElement(pVal, &amp;pAccEx);

}

if(pAccEx)

{

// GetIAccessiblePair を呼び出して {IAccessible, idChild} を取得します。

pAccEx-&gt;GetIAccessiblePair(&amp;pAcc, &amp;idChild);

}

// 最後に IAccessible、idChild を使用します。

if(pAcc)

{

// この UI 要素についての詳細情報を取得するには IAccessible メソッドを使用するか、

// IAccessible の観点から問題なく機能する既存のコードに渡します。

...

}

ページのトップへ


5. まとめ

IAccessibleEx インターフェイスにより、既存の Microsoft Active Accessibility サーバーの実装に UI オートメーションのプロパティやコントロール パターンを追加できます。IAccessibleEx インターフェイスは、UI オートメーションに対する既存の Microsoft Active Accessibility サーバーの機能を強化する費用対効果の高い方法、または Microsoft Active Accessibility のインプロセス クライアントから UI オートメーション プロバイダー インターフェイスに直接アクセスするための方法を提供します。

ページのトップへ


6. 詳細情報

ページのトップへ