Win32 API 日本語リファレンス
ホームUI.Accessibility › IRawElementProviderWindowlessSite

IRawElementProviderWindowlessSite

COM
IID0a2a93cc-bfad-42ac-9b2e-0991fb0d3ea0継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

Microsoft ActiveX コントロールサイトは、Microsoft UI Automation 対応の ActiveX コントロールがアクセシビリティを表現できるようにするために、このインターフェイスを実装します。

メソッド 2

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetAdjacentFragment(NavigateDirection direction, IRawElementProviderFragment** ppParent)

このコントロールサイトが所有するウィンドウレスの Microsoft ActiveX コントロールに隣接するフラグメントのフラグメントポインターを取得します。

directionNavigateDirectionin取得する隣接フラグメント(親、次の兄弟、前の兄弟など)を示す値です。
ppParentIRawElementProviderFragment**out隣接フラグメントを受け取ります。

戻り値

Type: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。direction が NavigateDirection_FirstChild または NavigateDirection_LastChild(これらはこのメソッドでは無効です)の場合、戻り値は E_INVALIDARG になります。要求された方向に隣接フラグメントが存在しない場合、メソッドは S_OK を返し、ppRetValNULL を設定します。

解説(Remarks)

フラグメントの親を返すには、IRawElementProviderFragment インターフェイスを実装するオブジェクトが Navigate メソッドを実装できる必要があります。ウィンドウレスの ActiveX コントロールは、親オブジェクトのアクセシブルツリー内での自身の位置を特定できない場合があるため、Navigate の実装は困難です。GetAdjacentFragment メソッドを使用すると、ウィンドウレスの ActiveX コントロールは自身のサイトに隣接フラグメントを問い合わせ、そのフラグメントを Navigate を呼び出したクライアントに返すことができます。

プロバイダーは通常、IRawElementProviderFragment::Navigate メソッドの処理の一部としてこのメソッドを呼び出します。

次の C++ コード例は、GetAdjacentFragment メソッドの実装方法を示しています。

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;

                // アプリケーション定義の関数を呼び出して
                // 親プロバイダーインターフェイスを取得します。
                hr = GetParentProvider(&pSimple);  
                if (SUCCEEDED(hr))  
                {  
                    // 親の IRawElementProviderFragment インターフェイスを取得します。
                    hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment));  
                    pSimple->Release();  
                } 
            }  
            break;  
  
        case NavigateDirection_FirstChild:
        case NavigateDirection_LastChild:
            hr = E_INVALIDARG;
            break;

        // 隣接フラグメントが存在しないため、NavigateDirection_NextSibling と
        // NavigateDirection_PreviousSibling は無視します。
        default:  
            break;  
    }  
  
    return hr;  
}   
vtbl 4 HRESULT GetRuntimeIdPrefix(SAFEARRAY** pRetVal)

ウィンドウレスの Microsoft ActiveX コントロールサイトに固有の Microsoft UI Automation ランタイム ID を取得します。

pRetValSAFEARRAY**outランタイム ID を受け取ります。

戻り値

Type: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

UI Automation フラグメントは、フラグメントの一意な ID を返すために IRawElementProviderFragment::GetRuntimeId メソッドを実装する必要があります。ウィンドウレスの ActiveX コントロールは、ActiveX コントロールコンテナー内の他のウィンドウレスコントロールの中で自身を一意なものとして識別できる必要があるため、これは困難です。この問題を解決するには、ウィンドウレスサイトは、定数 UiaAppendRuntimeId の後にこのウィンドウレスサイトに固有の整数値を続けた SAFEARRAY を作成することで、GetRuntimeIdPrefix メソッドを実装する必要があります。

これにより、フラグメントは、ウィンドウレスの ActiveX コントロール内の他のすべてのフラグメントに対して一意な整数値を追加し、それをクライアントに返すことができます。

たとえば、サイトは次の内容の SAFEARRAY を返す場合があります: { UiaAppendRuntimeId, 3 }。これはコンテナー内の 3 番目の ActiveX コントロールを表す可能性があります。フラグメントプロバイダーの GetRuntimeId メソッドは、次の内容の SAFEARRAY を作成できます: { UiaAppendRuntimeId, 3, 5 }。これは ActiveX コンテナー内の 5 番目のフラグメントを表す可能性があります。SAFEARRAY 全体が、ActiveX コントロールコンテナー全体に対して一意な ID となります。

プロバイダーは通常、GetRuntimeId メソッドの処理の一部としてこのメソッドを呼び出します。

次の C++ コード例は、GetRuntimeIdPrefix メソッドの実装方法を示しています。

IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix(   
     SAFEARRAY **ppsaPrefix)   
{   
    if (ppsaPrefix == NULL) 
    {
        return E_INVALIDARG;
    }

    // m_siteIndex はウィンドウレスコントロールのサイトの
    // インデックスです。コントロールコンテナーによって定義されます。
    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;  
}  
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IRawElementProviderWindowlessSite "{0A2A93CC-BFAD-42AC-9B2E-0991FB0D3EA0}"
#usecom global IRawElementProviderWindowlessSite IID_IRawElementProviderWindowlessSite "{}"
#comfunc global IRawElementProviderWindowlessSite_GetAdjacentFragment  3 int,sptr
#comfunc global IRawElementProviderWindowlessSite_GetRuntimeIdPrefix   4 var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。