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

IAccessible

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IID618736e0-3c3d-11cf-810c-00aa00389b71継承元IDispatch呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl7

公式ドキュメント

ユーザーインターフェイス要素とその子を、クライアントアプリケーションからアクセス可能にするメソッドとプロパティを公開します。

メソッド 21

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 7 HRESULT get_accParent(IDispatch** ppdispParent)

IAccessible::get_accParent メソッドは、オブジェクトの親の IDispatch を取得します。すべてのオブジェクトがこのプロパティをサポートします。

ppdispParentIDispatch**out 親オブジェクトの IDispatch インターフェイスのアドレスを受け取ります。親が存在しない場合、または子が親にアクセスできない場合、この変数は NULL に設定されます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
このオブジェクトには親が存在しません。
vtbl 8 HRESULT get_accChildCount(INT* pcountChildren)

IAccessible::get_accChildCount メソッドは、このオブジェクトに属する子の数を取得します。すべてのオブジェクトがこのプロパティをサポートする必要があります。

pcountChildrenINT*out このオブジェクトに属する子の数を受け取る変数のアドレスです。子はアクセス可能なオブジェクトまたは子要素です。オブジェクトに子がない場合、この値は 0 です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

解説(Remarks)

オブジェクト内の子の数は変化することがあります。アプリケーションは、このオブジェクトが生成する EVENT_OBJECT_CREATE および EVENT_OBJECT_DESTROY イベントを監視することで、子の数の変化を追跡します。

サーバー開発者向けの注意:  オブジェクトに子が 1 つもない場合は、S_OK を返し、pcountChildren を 0 に設定します。

vtbl 9 HRESULT get_accChild(VARIANT varChild, IDispatch** ppdispChild)

IAccessible::get_accChild メソッドは、指定された子が存在する場合、その IDispatch を取得します。すべてのオブジェクトがこのプロパティをサポートする必要があります。

varChildVARIANTinIDispatch インターフェイスが取得される子を指定します。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
ppdispChildIDispatch**out[out, retval] 子オブジェクトの IDispatch インターフェイスのアドレスを受け取ります。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
その子はアクセス可能なオブジェクトではありません。
E_INVALIDARG
引数が無効です。

解説(Remarks)

サーバーは、要素を単純な要素(子 ID)または完全なオブジェクト(IAccessible インターフェイスポインター)のいずれかとして公開します。 子が単純な要素の場合、get_accChildS_FALSE を返し、親がその子の情報を提供します。 子が完全なオブジェクトの場合、get_accChildIAccessible インターフェイスポインターを返し、親はその子の情報を提供しません。 一時的なシステムエラー(メモリ不足エラーなど)によりサーバーアプリケーションがアクセス可能なオブジェクトを作成できず get_accChild が失敗する場合、サーバーは適切な失敗コードを返す必要があります。

サーバー開発者向けの注意:  varChildIDVT_EMPTY が含まれる場合は、E_INVALIDARG を返す必要があります。

サーバーの例

次のサンプルコードは、子を持たないオブジェクト、または子がオブジェクトではなく単純な要素であるオブジェクトの実装を示しています。

HRESULT STDMETHODCALLTYPE AccServer::get_accChild( 
    VARIANT varChild,
    IDispatch **ppdispChild)
{
    if (varChild.vt != VT_I4)
    {
        *ppdispChild = NULL;
        return E_INVALIDARG;
    }
    *ppdispChild = NULL;    
    return S_FALSE;     
};
vtbl 10 HRESULT get_accName(VARIANT varChild, LPWSTR* pszName)

IAccessible::get_accName メソッドは、指定されたオブジェクトの名前を取得します。すべてのオブジェクトがこのプロパティをサポートします。

varChildVARIANTin取得される名前が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pszNameLPWSTR*out指定されたオブジェクトの名前を含む文字列を受け取る BSTR のアドレスです。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
指定されたオブジェクトには名前がありません。
E_INVALIDARG
引数が無効です。

解説(Remarks)

アイコン、メニュー、チェックボックス、コンボボックスなどの多くのオブジェクトやコントロールには、ユーザーに表示されるラベルがあります。 ユーザーに表示されるラベルは、オブジェクトの name プロパティとして使用されます。詳細については、Name プロパティ を参照してください。

サーバー開発者向けの注意:  name プロパティにメニューやボタンのテキストを使用する場合は、キーボードアクセスキーを示すアンパサンド(&)を削除してください。アクセスキーは、IAccessible::get_accKeyboardShortcut への応答としてクライアントに提供してください。

このプロパティから返される文字列はローカライズしてください。

サーバーの例

次の例は、独自の子要素を管理するカスタムリストボックスコントロールに対する、このメソッドの実装例を示しています。

// m_pStdAccessibleObject is the standard object returned by CreateStdAccessibleObject. 
// m_pControl is the control object that provides this accessibility object. It maintains
// a zero-based collection of child items. 

HRESULT STDMETHODCALLTYPE AccServer::get_accName( 
    VARIANT varChild,
    BSTR *pszName)
{
    if (varChild.vt != VT_I4)
    {
        *pszName = NULL;
        return E_INVALIDARG;
    }
    // For the control itself, let the standard accessible object return the name 
    // assigned by the application. This is either the "caption" property or, if 
    // there is no caption, the text of any label. 
    if (varChild.lVal == CHILDID_SELF)
    {
        return m_pStdAccessibleObject->get_accName(varChild, pszName);                  
    }
    
    // Else return the name of the item in the list. 
    else
    {
        CustomListControlItem* pItem = m_pControl->GetItemAt(varChild.lVal - 1);
        if (pItem)
        {
            *pszName = SysAllocString(pItem->GetName());        
       
        }
    }
    return S_OK;
};

クライアントの例

次のサンプル関数は、コントロールのアクセス可能な名前を表示します。

HRESULT PrintName(IAccessible* pAcc, long childId)
{
    if (pAcc == NULL)
    {
        return E_INVALIDARG;
    }
    BSTR bstrName;
    VARIANT varChild;
    varChild.vt = VT_I4;
    varChild.lVal = childId;
    HRESULT hr = pAcc->get_accName(varChild, &bstrName);
    printf("Name: %S ", bstrName);
    SysFreeString(bstrName);
    return hr;
}
vtbl 11 HRESULT get_accValue(VARIANT varChild, LPWSTR* pszValue)

IAccessible::get_accValue メソッドは、指定されたオブジェクトの値を取得します。すべてのオブジェクトが値を持つわけではありません。

varChildVARIANTin取得される値の情報が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pszValueLPWSTR*out オブジェクトの現在の値を含む、ローカライズされた文字列を受け取る BSTR のアドレスです。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。
E_INVALIDARG
引数が無効です。

解説(Remarks)

スクロールバーやトラックバーのアクセス可能なオブジェクトから返される数値は、パーセンテージを表します。これらは 0 から 100 までの整数(両端を含む)ですが、たとえば 1 から 16 までのように限定された範囲になることもあります。また、一部のスクロールバーやトラックバーのオブジェクトは、画面サイズやインターネットセキュリティなどの設定に対応する文字列を返します。

サーバー開発者向けの注意:  このプロパティから返される文字列はローカライズしてください。

vtbl 12 HRESULT get_accDescription(VARIANT varChild, LPWSTR* pszDescription)

IAccessible::get_accDescription メソッドは、指定されたオブジェクトの視覚的な外観を説明する文字列を取得します。すべてのオブジェクトが説明を持つわけではありません。

varChildVARIANTin取得される説明が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pszDescriptionLPWSTR*out 指定されたオブジェクトを説明する、ローカライズされた文字列を受け取る BSTR のアドレスです。オブジェクトに説明がない場合は NULL です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

戻り値 説明
S_FALSE
指定されたオブジェクトには説明がありません。
E_INVALIDARG
引数が無効です。
DISP_E_MEMBERNOTFOUND
指定されたオブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

Microsoft Active Accessibility サーバーは、Direct Annotation を使用する、IAccessibleEx インターフェイスを使用する、または Microsoft Active Accessibility と UI Automation を並行して実装し、両方の実装で WM_GETOBJECT メッセージを処理することによって、UI Automation のサポートを追加できます。

このプロパティは、オブジェクトのテキストによる等価表現をユーザーに提供します。説明は、HTML の ALT 属性で指定されるテキスト(テキストのみのブラウザーを使用するユーザーに対して画像を説明するために表示されるテキスト)に類似したものにする必要があります。ただし、一部のコントロールは、このプロパティを、テキストによる等価表現とは関係のないコントロールに関する追加情報を格納するために使用します。このプロパティの詳細については、Description プロパティ を参照してください。

サーバー開発者向けの注意:  このプロパティから返される文字列はローカライズしてください。

サーバーの例

次のサンプルコードは、独自の子要素を保持するカスタムリストボックスに対する、このメソッドの実装例の 1 つを示しています。この例は構文を示すものですが、実際のテキストのみのリストボックスであれば、おそらくこのプロパティをサポートする必要はないことに注意してください。簡潔にするため、この例の文字列はローカライズされていません。

HRESULT STDMETHODCALLTYPE AccServer::get_accDescription( 
    VARIANT varChild,
    BSTR *pszDescription)
{
    if (varChild.vt != VT_I4)
    {
        *pszDescription = NULL;
        return E_INVALIDARG;
    }
    if (varChild.lVal == CHILDID_SELF)
    {
        *pszDescription = SysAllocString(L"List of contacts.");    
            
    }
    else
    {
        *pszDescription = SysAllocString(L"A contact.");           
            
    }
    return S_OK;
};

クライアントの例

次のサンプル関数は、指定されたアクセス可能なオブジェクトまたは子要素の説明を取得し、コンソールに表示します。

HRESULT PrintDescription(IAccessible* pAcc, long child)
{
    VARIANT varObject;
    varObject.vt = VT_I4;
    varObject.lVal = child;
    BSTR bstrDesc;
    HRESULT hr = pAcc->get_accDescription(varObject, &bstrDesc);
    if (hr == S_OK)
    {
        printf("Description: %S\n", bstrDesc);
        SysFreeString(bstrDesc);
    }
    return hr;
}
vtbl 13 HRESULT get_accRole(VARIANT varChild, VARIANT* pvarRole)

IAccessible::get_accRole メソッドは、指定されたオブジェクトのロールを説明する情報を取得します。すべてのオブジェクトがこのプロパティをサポートします。

varChildVARIANTin取得されるロール情報が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pvarRoleVARIANT*outオブジェクトのロール 定数を受け取る VARIANT のアドレスです。vt メンバーは VT_I4 でなければなりません。lVal メンバーはオブジェクトのロール定数を受け取ります。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
E_INVALIDARG
引数が無効です。

解説(Remarks)

クライアントは GetRoleText を呼び出して、オブジェクトのロールを説明するローカライズされた文字列を取得します。

サーバー開発者向けの注意:  定義済みのロール定数を使用する必要があります。

サーバーの例

次のサンプルコードは、独自のリスト項目を保持するカスタムリストボックスに対する、このメソッドの実装例です。

HRESULT STDMETHODCALLTYPE AccServer::get_accRole( 
    VARIANT varChild,
    VARIANT *pvarRole)
{
    if (varChild.vt != VT_I4)
    {
        pvarRole->vt = VT_EMPTY;
        return E_INVALIDARG;
    }

    pvarRole->vt = VT_I4;

    if (varChild.lVal == CHILDID_SELF)
    {
        pvarRole->lVal = ROLE_SYSTEM_LIST;
    }
    else
    {
        pvarRole->lVal = ROLE_SYSTEM_LISTITEM;
    }
    return S_OK;
};

クライアントの例

次のサンプル関数は、アクセス可能なオブジェクトまたは子要素のロールを表示します。

HRESULT PrintRole(IAccessible* pAcc, long childId)
{
    DWORD roleId;
    if (pAcc == NULL)
    {
        return E_INVALIDARG;    
    }
    VARIANT varChild;
    varChild.vt = VT_I4;
    varChild.lVal = childId;
    VARIANT varResult;
    HRESULT hr = pAcc->get_accRole(varChild, &varResult);
    if ((hr == S_OK) && (varResult.vt == VT_I4))
    {
        roleId = varResult.lVal;
        UINT   roleLength;
        LPTSTR lpszRoleString;

        // Get the length of the string. 
        roleLength = GetRoleText(roleId, NULL, 0);

        // Allocate memory for the string. Add one character to 
        // the length you got in the previous call to make room 
        // for the null character. 
        lpszRoleString = (LPTSTR)malloc((roleLength+1) * sizeof(TCHAR));
        if (lpszRoleString != NULL)
        {
            // Get the string. 
            GetRoleText(roleId, lpszRoleString, roleLength + 1);
#ifdef UNICODE
            printf("Role: %S\n", lpszRoleString);
#else
            printf(("Role: %s\n", lpszRoleString);
#endif
            // Free the allocated memory 
            free(lpszRoleString);
        }
        else 
        {
            return E_OUTOFMEMORY;
        }
    }
    return S_OK;
}
vtbl 14 HRESULT get_accState(VARIANT varChild, VARIANT* pvarState)

IAccessible::get_accState メソッドは、指定されたオブジェクトの現在の状態を取得します。すべてのオブジェクトがこのプロパティをサポートします。

varChildVARIANTin取得される状態情報が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pvarStateVARIANT*outオブジェクトの状態を説明する情報を受け取る VARIANT 構造体 のアドレスです。vt メンバーは VT_I4 で、lVal メンバーは 1 つ以上の オブジェクトの状態定数 です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
E_INVALIDARG
引数が無効です。

解説(Remarks)

定義済みの状態値が返される場合、クライアントは GetStateText を呼び出して、オブジェクトの状態を説明するローカライズされた文字列を取得します。

子の実際の状態は、その祖先の状態に依存することがよくあります。たとえば、モーダルダイアログボックスが開いているとき、アプリケーションのメインウィンドウ内のコントロールはフォーカスを受け取れませんが、コントロールがこの状態を報告しない場合があります。子オブジェクトの状態情報を確認するには、親オブジェクトに対して get_accState を呼び出します。

サーバー開発者向けの注意:  定義済みの状態定数を使用する必要があります。

サーバーの例

次のサンプルコードは、独自の子要素(リスト項目)を保持し、一度に 1 つだけ選択できるカスタムリストボックスに対する、このメソッドの実装例を示しています。クライアントがリストボックス自体の状態を要求した場合、このメソッドは呼び出しを、コントロールウィンドウを処理する標準のアクセス可能なオブジェクトに渡します。子項目については、項目が選択されているかどうかに応じて異なるフラグが返されます。

// m_pStdAccessibleObject is the standard accessible object returned by CreateAccessibleObject. 
// m_pControl is the custom control instance that returns this accessible object. 

HRESULT STDMETHODCALLTYPE AccServer::get_accState( 
    VARIANT varChild,
    VARIANT *pvarState)
{
    if (varChild.vt != VT_I4)
    {
        pvarState->vt = VT_EMPTY;
        return E_INVALIDARG;
    }
    if (varChild.lVal == CHILDID_SELF)
    {
        return m_pStdAccessibleObject->get_accState(varChild, pvarState);
    }
    else  // For list items. 
    {
        DWORD flags = STATE_SYSTEM_SELECTABLE;
        int index = (int)varChild.lVal - 1;
        if (index == m_pControl->GetSelectedIndex())
        {
            flags |= STATE_SYSTEM_SELECTED;
        }
        pvarState->vt = VT_I4;
        pvarState->lVal = flags; 
    }
    return S_OK;
};

クライアントの例

次のサンプル関数は、指定されたアクセス可能なオブジェクトまたは子要素の状態を表示します。

HRESULT PrintState(IAccessible* pAcc, long childId)
{
    if (pAcc == NULL)
    {
        return E_INVALIDARG;    
    }
    VARIANT      varChild;
    varChild.vt = VT_I4;
    varChild.lVal = childId;
    VARIANT varResult;
    HRESULT hr = pAcc->get_accState(varChild, &varResult);
    long stateBits = 0;
    if ((hr == S_OK) && (varResult.vt == VT_I4))
    {
        printf("State: ");
        stateBits = (DWORD)varResult.lVal;
        for (DWORD mask = 1; mask <= 0x8000; mask <<= 1)
        {
            if (mask & stateBits)
            {

                // Get the length of the string. 
                UINT stateLength = GetStateText(mask, NULL, 0);

                // Allocate memory for the string. Add one character to 
                // the length you got in the previous call to make room 
                // for the null character. 
                LPTSTR lpszStateString = (LPTSTR)malloc(
                    (stateLength + 1) * sizeof(TCHAR));
                if (lpszStateString != NULL)
                {
                    // Get the string. 
                    GetStateText(mask, 
                        lpszStateString, stateLength + 1); 
#ifdef UNICODE
                    printf("%S\n", lpszStateString);
#else
                    printf(("%s\n", lpszStateString);
#endif
                    // Free the allocated memory
                    free(lpszStateString);
                }
                else 
                {
                    return E_OUTOFMEMORY;
                }
            }
        }
    }
    return hr;
}
vtbl 15 HRESULT get_accHelp(VARIANT varChild, LPWSTR* pszHelp)

IAccessible::get_accHelp メソッドは、オブジェクトの Help プロパティ文字列を取得します。すべてのオブジェクトがこのプロパティをサポートするわけではありません。

varChildVARIANTin取得されるヘルプ情報が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素の 1 つに関する情報を取得する場合)のいずれかです。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pszHelpLPWSTR*out指定されたオブジェクトのヘルプ情報を含む、ローカライズされた文字列を受け取る BSTR のアドレスです。ヘルプ情報が利用できない場合は NULL です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
ヘルプ情報は利用できません。
E_INVALIDARG
引数が無効です。
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

定義済みコントロールおよびコモンコントロールのいずれも、このプロパティをサポートしていません。

サーバー開発者向けの注意:  このプロパティから返される文字列はローカライズしてください。

このプロパティは文字列を返しますが、IAccessible::get_accHelpTopicWinHelp 内のヘルプトピックへのアクセスを提供します。オブジェクトは IAccessible::get_accHelpIAccessible::get_accHelpTopic の両方をサポートする必要はありませんが、少なくとも一方をサポートする必要があります。文字列を容易に返せる場合は IAccessible::get_accHelp をサポートする必要があり、そうでない場合は IAccessible::get_accHelpTopic をサポートする必要があります。両方がサポートされている場合、IAccessible::get_accHelpTopic はより詳細な情報を提供します。

サーバーの例

次のサンプルコードは、カスタムリストボックスに対する、このメソッドの実装例の 1 つを示しています。リスト内の連絡先の状態に応じて異なるテキストが表示されます。簡潔にするため、この例では返される文字列をローカライズしていません。

// m_pControl is the custom control that returns this accessible object. 
// 'online' is an enumerated value. 

HRESULT STDMETHODCALLTYPE AccServer::get_accHelp( 
    VARIANT varChild,
    BSTR *pszHelp)
{
    *pszHelp = NULL;
    if (varChild.vt != VT_I4)
    {
        return E_INVALIDARG;
    }
    if (varChild.lVal == CHILDID_SELF)
    {
        *pszHelp = SysAllocString(L"Contact list.");
    }
    else
    {
        int index = (int)varChild.lVal - 1;
        CustomListControlItem* pItem = m_pControl->GetItemAt(index);
        if (pItem == NULL)
        {
            return E_INVALIDARG;
        }
        if (pItem->GetStatus() == online)
        {
            *pszHelp = SysAllocString(L"Online contact.");
        }
        else 
        {
            *pszHelp = SysAllocString(L"Offline contact.");
        }
    }
    return S_OK;
};
vtbl 16 HRESULT get_accHelpTopic(LPWSTR* pszHelpFile, VARIANT varChild, INT* pidTopic)

IAccessible::get_accHelpTopic メソッドは、指定されたオブジェクトに関連付けられた WinHelp ファイルのフルパスを取得します。また、そのファイル内の該当するトピックの識別子も取得します。

pszHelpFileLPWSTR*out指定されたオブジェクトに関連付けられた WinHelp ファイルのフルパスを受け取る BSTR のアドレスです。
varChildVARIANTin取得されるヘルプトピックが、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトのヘルプトピックを取得する場合)か、子 ID(オブジェクトの子要素の 1 つのヘルプトピックを取得する場合)のいずれかです。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pidTopicINT*out[out, retval] 指定されたオブジェクトに関連付けられたヘルプファイルのトピックを識別する変数のアドレスです。この値は、WinHelp 関数に渡す目的のトピックのコンテキスト識別子として使用されます。トピックを表示するために WinHelp を呼び出すときは、uCommand パラメーターを HELP_CONTEXT に設定し、pidTopic が指す値を DWORD にキャストして、dwData パラメーターとして渡します。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
ヘルプ情報は利用できません。
E_INVALIDARG
引数が無効です。
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

ヘルプファイルから情報を取得すると、時間とメモリを多く消費する場合があります。

サーバー開発者向けの注意:  このプロパティは WinHelp 内のヘルプトピックへのアクセスを提供しますが、IAccessible::get_accHelp は文字列を返します。オブジェクトは IAccessible::get_accHelpIAccessible::get_accHelpTopic の両方をサポートする必要はありませんが、少なくとも一方をサポートする必要があります。文字列を容易に返せる場合は IAccessible::get_accHelp をサポートする必要があり、そうでない場合は IAccessible::get_accHelpTopic をサポートする必要があります。両方がサポートされている場合、IAccessible::get_accHelpTopic はより詳細な情報を提供します。

vtbl 17 HRESULT get_accKeyboardShortcut(VARIANT varChild, LPWSTR* pszKeyboardShortcut)

IAccessible::get_accKeyboardShortcut メソッドは、指定されたオブジェクトのショートカットキーまたはアクセスキー(ニーモニックとも呼ばれます)を取得します。ショートカットキーまたはアクセスキーを持つすべてのオブジェクトがこのプロパティをサポートします。

varChildVARIANTin取得されるキーボードショートカットが、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pszKeyboardShortcutLPWSTR*out キーボードショートカットを識別する、ローカライズされた文字列を受け取る BSTR のアドレスです。指定されたオブジェクトにキーボードショートカットが関連付けられていない場合は NULL です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
オブジェクトに関連付けられたキーボードショートカットはありません。
E_INVALIDARG
引数が無効です。
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

アクセスキーとは、メニュー、メニュー項目、またはボタンやその他のコントロールのラベルのテキスト内にある下線付きの文字です。たとえば、ユーザーは ALT キーを押しながら、示された下線付きのキーを押すことでメニューを表示できます(File メニューを開くための ALT+F など)。メニュー項目のアクセスキーを使用するには、その項目を含むメニューがアクティブである必要があります。

ツールバーボタンやメニュー項目などのコントロールには、キーボードアクセラレーターとも呼ばれるショートカットキーが関連付けられていることがよくあります。メニュー項目によっては、アクセスキーとショートカットキーの両方を持つ場合もあれば、一方のみを持つ場合もあります。たとえば、New というメニュー項目には、アクセスキー N とショートカットキー CTRL+N があります。ショートカットキーが機能するために、メニューがアクティブである必要はありません。

クライアント開発者向けの注意:  

このプロパティが単一の文字を返す場合でも、それがアクセスキーであるかキーボードショートカットであるかを想定することはできません。標準的なメニュー項目では、アクセスキーは IAccessible::get_accKeyboardShortcut によって返され、ショートカットキーは IAccessible::get_accName から返されるメニュー項目名の一部として返されます。一般に、アクセスキーは ALT + <letter> として定義される傾向があり、キーボードショートカットは CTRL + <letter> である傾向があります。

サーバー開発者向けの注意:  UI 要素がキーボードフォーカスを受け取ることができる場合は、その要素のアクセスキーを公開してください。UI 要素がキーボードフォーカスを受け取れない場合(ツールバーアイコンなど)は、ショートカットキーを表示してください。

ショートカットキーは通常、コントロール自体ではなくアプリケーションによって決定されるため、サーバーは通常、ウィンドウの標準のアクセス可能なオブジェクトから取得した値を返すことができます。

クライアントの例

次のサンプル関数は、指定されたアクセス可能なオブジェクトまたはその子の 1 つのキーボードショートカットを取得し、コンソールに出力します。

HRESULT PrintShortcut(IAccessible* pAcc, long child)
{
    if (pAcc == NULL)
    {
        return E_INVALIDARG;
    }
    BSTR bstrShortcut;
    VARIANT varObj;
    varObj.vt = VT_I4;
    varObj.lVal = child;
    HRESULT hr = pAcc->get_accKeyboardShortcut(varObj, &bstrShortcut);
    if (hr == S_OK)
    {
        printf("Shortcut: %S\n", bstrShortcut);
        SysFreeString(bstrShortcut);
    }
    return hr;
}
vtbl 18 HRESULT get_accFocus(VARIANT* pvarChild)

IAccessible::get_accFocus メソッドは、キーボードフォーカスを持つオブジェクトを取得します。キーボードフォーカスを受け取る可能性のあるすべてのオブジェクトがこのプロパティをサポートする必要があります。

pvarChildVARIANT*out

フォーカスを持つオブジェクトに関する情報を受け取る VARIANT 構造体 のアドレスです。次の表は、pvarID で返される情報を説明しています。

意味
VT_EMPTY
なし。このオブジェクトもその子のいずれもキーボードフォーカスを持っていません。
VT_I4
lValCHILDID_SELF です。オブジェクト自体がキーボードフォーカスを持っています。
VT_I4
lVal は、キーボードフォーカスを持つ子要素の子 ID を含みます。
VT_DISPATCH
pdispVal メンバーは、キーボードフォーカスを持つ子オブジェクトの IDispatch インターフェイス のアドレスです。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
オブジェクトはウィンドウですが、フォアグラウンドウィンドウではありません。
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

キーボードフォーカスの概念は、アクティブウィンドウの概念に関連しています。アクティブウィンドウとは、ユーザーが作業しているフォアグラウンドウィンドウです。キーボードフォーカスを持つオブジェクトは、アクティブウィンドウ自体か、アクティブウィンドウの子オブジェクトのいずれかです。

コンテナー内で、任意の時点においてフォーカスを持つオブジェクトまたは項目は 1 つだけです。キーボードフォーカスを持つオブジェクトが、必ずしも選択されているオブジェクトであるとは限りません。選択とフォーカスの違いの詳細については、選択とフォーカスのプロパティおよびメソッド を参照してください。

このメソッドは、pvarID として IDispatch インターフェイスポインターまたは子 ID のいずれかを返します。IDispatch インターフェイスポインターまたは子 ID の使用方法の詳細については、パラメーターでの子 ID の使用方法 を参照してください。

他の IAccessible のメソッドや関数と同様に、ユーザーの操作によってクライアントが IAccessible インターフェイスポインターに対するエラーを受け取ることがあります。詳細については、IAccessible インターフェイスポインターに対するエラーの受け取り を参照してください。

サーバーの例

次のサンプルコードは、カスタムの単一選択リストボックスに対する、このメソッドの実装例を示しています。コントロールがフォーカスを持っていない場合、HWND の標準のアクセス可能なオブジェクトによって VARIANT に VT_EMPTY が返されます。コントロールがフォーカスを持っており、項目が選択されている場合は、その項目の子 ID が返されます。選択がない場合は、CHILDID_SELF が返されます。

// m_pControl is the control object that is served by this implementation. 
// m_pStdAccessibleObject is the object returned by CreateStdAccessibleObject. 

HRESULT STDMETHODCALLTYPE AccServer::get_accFocus(VARIANT *pvarChild)
{
    FAIL_IF_NO_CONTROL;  // Macro that checks for existence of control. 

    HRESULT hr = m_pStdAccessibleObject->get_accFocus(pvarChild);  
    if (pvarChild->vt != VT_I4)
    {
        return hr;
    }
    else
    {
        int index = m_pControl->GetSelectedIndex();
        if (index <0)
        {
            pvarChild->lVal = CHILDID_SELF;
        }
        else
        {
            // Convert to 1-based index for child ID. 
            pvarChild->lVal = index + 1;
        }
    }
    return S_OK;
};

vtbl 19 HRESULT get_accSelection(VARIANT* pvarChildren)

IAccessible::get_accSelection メソッドは、このオブジェクトの選択された子を取得します。選択をサポートするすべてのオブジェクトがこのプロパティをサポートする必要があります。

pvarChildrenVARIANT*out

どの子が選択されているかに関する情報を受け取る VARIANT 構造体 のアドレスです。次の表は、pvarChildren で返される情報を説明しています。

vt メンバー 値メンバー
VT_EMPTY
選択されている子はありません。
VT_DISPATCH
1 つの子オブジェクトが選択されており、その IDispatch インターフェイスのアドレスが pdispVal メンバーに設定されます。
VT_I4
lVal は、選択されている子要素の子 ID を含みます。lValCHILDID_SELF の場合、オブジェクト自体が選択されていることを意味します。
VT_UNKNOWN
複数の子オブジェクトが選択されており、punkVal メンバーには IUnknown インターフェイスのアドレスが格納されます。クライアントはこのインターフェイスに対して IEnumVARIANT インターフェイスを照会し、それを使用して選択されたオブジェクトを列挙します。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

このメソッドは IEnumVARIANT インターフェイスをサポートする必要があります。

このメソッドは、pvarChildren パラメーターとして IDispatch インターフェイスポインターまたは子 ID のいずれかを返します。IDispatch インターフェイスポインターまたは子 ID の使用方法の詳細については、パラメーターでの子 ID の使用方法 を参照してください。

他の IAccessible のメソッドや関数と同様に、ユーザーの操作によってクライアントが IAccessible インターフェイスポインターに対するエラーを受け取ることがあります。詳細については、IAccessible インターフェイスポインターに対するエラーの受け取り を参照してください。

注意:  このメソッドは、選択されたテキストではなく、選択された項目を取得します。

サーバーの例

次のサンプルコードは、カスタムの単一選択リストボックスに対する、このメソッドの実装例を示しています。その GetSelectedIndex メソッドは、項目が選択されていない場合に -1 を返します。

// m_pControl is the control that returns this accessible object. 

HRESULT STDMETHODCALLTYPE AccServer::get_accSelection(VARIANT *pvarChildren)
{
    int childID = m_pControl->GetSelectedIndex() + 1; // Convert from 0-based. 
    if (childID <= 0)
    {
        pvarChildren->vt = VT_EMPTY;
    }
    else 
    {
        pvarChildren->vt = VT_I4;
        pvarChildren->lVal = childID;
    }
    return S_OK;
};



vtbl 20 HRESULT get_accDefaultAction(VARIANT varChild, LPWSTR* pszDefaultAction)

IAccessible::get_accDefaultAction メソッドは、オブジェクトの既定のアクションを示す文字列を取得します。すべてのオブジェクトが既定のアクションを持つわけではありません。

varChildVARIANTin取得される既定のアクションが、オブジェクトによって実行されるか、オブジェクトの子要素の 1 つによって実行されるかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pszDefaultActionLPWSTR*out指定されたオブジェクトの既定のアクションを説明する、ローカライズされた文字列を受け取る BSTR のアドレスです。オブジェクトに既定のアクションがない場合、値は NULL です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
指定されたオブジェクトには既定のアクションがありません。
E_INVALIDARG
引数が無効です。
DISP_E_MEMBERNOTFOUND
指定されたオブジェクトはこのプロパティをサポートしていません。

解説(Remarks)

取得される文字列は、オブジェクトに対して実行されるアクションを説明するものであり、その結果としてオブジェクトが行うことを説明するものではありません。たとえば、ドキュメントを印刷するツールバーボタンの既定のアクションは、"Prints the current document." ではなく "Press" です。

オブジェクトの既定のアクションを、その値と混同しないでください。詳細については、DefaultAction プロパティ を参照してください。

アクションを実行するコントロールのみが、このメソッドをサポートします。

サーバー開発者向けの注意:  このプロパティから返される文字列はローカライズしてください。

サーバーの例

次のサンプルコードは、カスタムリストボックスに対する、このメソッドの実装例を示しています。簡潔にするため、文字列はローカライズされていません。

HRESULT STDMETHODCALLTYPE AccServer::get_accDefaultAction( 
    VARIANT varChild,
    BSTR *pszDefaultAction)
{
    if (varChild.vt != VT_I4)
    {
        *pszDefaultAction = NULL;
        return E_INVALIDARG;
    }
    if (varChild.lVal == CHILDID_SELF)
    {
        *pszDefaultAction = SysAllocString(L"None.");
    }
    else
    {
        *pszDefaultAction = SysAllocString(L"Double-click");
    }
    return S_OK;
};
vtbl 21 HRESULT accSelect(INT flagsSelect, VARIANT varChild)

IAccessible::accSelect メソッドは、指定されたオブジェクトの選択を変更する、またはキーボードフォーカスを移動します。選択をサポートする、またはキーボードフォーカスを受け取るすべてのオブジェクトがこのメソッドをサポートする必要があります。

flagsSelectINTin実行する選択またはフォーカスの操作を指定します。このパラメーターには、SELFLAG 定数 の組み合わせを指定する必要があります。
varChildVARIANTin選択されるオブジェクトを指定します。値が CHILDID_SELF の場合はオブジェクト自体が選択され、子 ID の場合はオブジェクトの子要素の 1 つが選択されます。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。

エラー 説明
S_FALSE
指定されたオブジェクトは選択されていません。
E_INVALIDARG
引数が無効です。この戻り値は、指定された SELFLAG の組み合わせが無効であるか、SELFLAG の値が指定されたオブジェクトにとって意味をなさないことを表します。たとえば、単一選択のリストボックスでは次のフラグは使用できません: SELFLAG_EXTENDSELECTIONSELFLAG_ADDSELECTIONSELFLAG_REMOVESELECTION
DISP_E_MEMBERNOTFOUND
オブジェクトはこのメソッドをサポートしていません。

解説(Remarks)

クライアントアプリケーションは、このメソッドを使用して複雑な選択操作を実行します。詳細については、子オブジェクトの選択 を参照してください。このメソッドは、アプリケーション間で入力フォーカスをプログラムから切り替える最も簡単な方法を提供します。これは Windows 2000 上で実行されるアプリケーションに適用されます。

注意:  このメソッドは、テキストではなく項目の選択を対象としています。

クライアントの例

次のサンプル関数は、画面上の指定された点にある項目を選択します。単一選択を想定しています。

HRESULT SelectItemAtPoint(POINT point)
{
    VARIANT varItem;
    IAccessible* pAcc;
    HRESULT hr = AccessibleObjectFromPoint(point, &pAcc, &varItem);
    if ((hr == S_OK))
    {
        hr = pAcc->accSelect((SELFLAG_TAKEFOCUS | SELFLAG_TAKESELECTION), varItem);
        VariantClear(&varItem);
        pAcc->Release();
    }
    return hr;
}
vtbl 22 HRESULT accLocation(INT* pxLeft, INT* pyTop, INT* pcxWidth, INT* pcyHeight, VARIANT varChild)

IAccessible::accLocation メソッドは、指定されたオブジェクトの現在の画面上の位置を取得します。すべての視覚的なオブジェクトはこのメソッドをサポートする必要があります。サウンドオブジェクトはこのメソッドをサポートしません。

pxLeftINT*outオブジェクトの位置の左上境界の x 座標を受け取る変数のアドレスです(物理的な画面座標)。
pyTopINT*outオブジェクトの位置の左上境界の y 座標を受け取る変数のアドレスです(物理的な画面座標)。
pcxWidthINT*outオブジェクトの幅を受け取る変数のアドレスです(ピクセル単位)。
pcyHeightINT*outオブジェクトの高さを受け取る変数のアドレスです(ピクセル単位)。
varChildVARIANTinサーバーが返す位置が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに関する情報を取得する場合)か、子 ID(オブジェクトの子要素に関する情報を取得する場合)のいずれかです。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。

戻り値

型: HRESULT

成功した場合は S_OK を返します。クライアントは、出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
DISP_E_MEMBERNOTFOUND
オブジェクトはこのメソッドをサポートしていません。
E_INVALIDARG
引数が無効です。

解説(Remarks)

このメソッドは、オブジェクトの外接する四角形を取得します。オブジェクトが四角形以外の形状を持つ場合、このメソッドは、オブジェクトの領域全体を完全に包含する最小の四角形を返します。四角形以外のオブジェクトの場合、オブジェクトの外接する四角形の座標は、IAccessible::accHitTest でテストすると失敗することがあります。そのような四角形以外のオブジェクトの例として、大きいアイコンモードのリストビュー項目があり、1 つの項目がアイコン用の四角形とアイコンのテキスト用の別の四角形を持ちます。accLocation は外接する四角形を返すため、その四角形内のすべての点がオブジェクトの実際の境界内にあるとは限りません。外接する四角形内の一部の点は、オブジェクト上にない場合があります。詳細については、ヒットテストと画面上の位置によるナビゲーション を参照してください。

注意:  このメソッドは幅と高さを返します。右端と下端の座標が必要な場合は、right = left + width および bottom = top + height を使用して計算してください。

サーバーの例

次の例は、リスト項目が子要素であるカスタムリストボックスに対する、このメソッドの実装例を示しています。リストボックス自体については、呼び出しが標準のアクセス可能なオブジェクトに渡され、ウィンドウの画面座標が返されます。

// m_pStdAccessibleObject is the standard accessible object for the control window. 
// m_pControl is the object that represents the control. Its GetItemRect method  
//   retrieves the screen coordinates of the specified item in a zero-based collection. 
// 
HRESULT STDMETHODCALLTYPE AccServer::accLocation( 
    long *pxLeft,
    long *pyTop,
    long *pcxWidth,
    long *pcyHeight,
    VARIANT varChild)
{
    *pxLeft = 0;
    *pyTop = 0;
    *pcxWidth = 0;
    *pcyHeight = 0;
    if (varChild.vt != VT_I4)
    {
        return E_INVALIDARG;
    }
    if (varChild.lVal == CHILDID_SELF)
    {
        return m_pStdAccessibleObject->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varChild);
    }
    else
    {
        RECT rect;
        if (m_pControl->GetItemRect(varChild.lVal - 1, &rect) == FALSE)
        {
            return E_INVALIDARG;
        }
        else
        {
            *pxLeft = rect.left;
            *pyTop = rect.top;
            *pcxWidth = rect.right - rect.left;
            *pcyHeight = rect.bottom - rect.top;
            return S_OK;        
        }
    }
};
vtbl 23 HRESULT accNavigate(INT navDir, VARIANT varStart, VARIANT* pvarEndUpAt)

IAccessible::accNavigate メソッドは、コンテナー内の別の UI 要素へ移動し、そのオブジェクトを取得します。このメソッドは省略可能です。

navDirINTinナビゲートする方向を指定します。この方向は、左右などの 空間的 な順序、または次や前などの 論理的 な順序で表されます。この値は、ナビゲーション定数 のいずれかです。
varStartVARIANTinナビゲーションの開始オブジェクトが、オブジェクト自体か、オブジェクトの子の 1 つかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトから開始する場合)か、子 ID(オブジェクトの子要素の 1 つから開始する場合)のいずれかです。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
pvarEndUpAtVARIANT*out

[out, retval] 宛先オブジェクトに関する情報を受け取る VARIANT 構造体のアドレスです。次の表は、pvarEnd で返される情報を説明しています。

vt メンバー 値メンバー
VT_EMPTY
なし。指定された方向に UI 要素はありませんでした。
VT_I4
lVal は、UI 要素の子 ID を含みます。
VT_DISPATCH
pdispVal は、UI 要素の IDispatch のアドレスを含みます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 および Return Values を参照してください。

エラー 説明
S_FALSE
指定された方向に画面要素が見つかりませんでした。
DISP_E_MEMBERNOTFOUND
オブジェクトはこのメソッドをサポートしていません。
E_INVALIDARG
引数が無効です。

解説(Remarks)

空間的なナビゲーションと論理的なナビゲーションのいずれも、常にコンテナー内の UI 要素に限定されます。空間的なナビゲーションでは、クライアントは開始オブジェクト(varStart)の兄弟へのみ移動します。論理的なナビゲーションで使用されるナビゲーションフラグに応じて、クライアントは開始オブジェクトの子または兄弟のいずれかへ移動します。

accNavigate メソッドは、定義された画面上の位置を持つ UI 要素と、定義された画面上の位置を持たない非表示のオブジェクトを取得します。

このメソッドは、選択やフォーカスを変更しません。フォーカスを変更する、またはオブジェクトを選択するには、IAccessible::accSelect を使用してください。

画面要素をたどる際のループを防ぐため、最後の要素に対して NAVDIR_NEXT を指定した場合、または最初の要素に対して NAVDIR_PREVIOUS を指定した場合、accNavigateVT_EMPTY とともに S_FALSE を返します。

他の IAccessible のメソッドや関数と同様に、ユーザーの操作によってクライアントが IAccessible インターフェイスポインターに対するエラーを受け取ることがあります。詳細については、IAccessible インターフェイスポインターに対するエラーの受け取り を参照してください。

メニュー、メニュー項目、ポップアップメニューなど、一部のシステム定義の UI 要素では、非表示のオブジェクトへのナビゲーションが可能です。ただし、その他のシステム定義の UI 要素はこれをサポートしていません。サーバーは、非表示のオブジェクトへのナビゲーションをサポートするかどうかを選択でき、それらをスキップすることも公開することもできます。

クライアントアプリケーションは、accNavigate を使用してオブジェクト間を移動する際、戻り値に対して後処理を行う必要があります。後処理の手順の目的は、クライアントが UI 要素に対して IAccessible のメソッドやプロパティを使用できるように、IAccessible インターフェイスポインターと子 ID を提供することです。

次の表は、以下の条件に基づく IAccessible::accNavigate の考えられるシナリオを説明しています。

これらの表では、startIDendIDVT_I4 の子 ID(単純な要素)であり、pStartAccpEndAccCHILDID_SELF を伴う VT_I4(完全なオブジェクト)であると想定します。

この表は、次の NAVDIR_ フラグ(NEXT、PREVIOUS、LEFT、RIGHT、UP、DOWN)について説明します。ナビゲーションフラグの詳細については、ナビゲーション定数 を参照してください。

開始点 返される結果 戻り値に対する後処理
pStartAcc, startID VT_I4 endID pStartAcc に対して endID を渡して get_accChild を呼び出します。get_accChild で説明されている通常の手順に従います。
pStartAcc, startID VT_DISPATCH pEndAcc pEndAcc について、IDispatch インターフェイスポインターを IAccessible インターフェイスポインターに変換する標準的な手順を使用します。
pStartAcc, CHILDID_SELF VT_I4 endID pStartAcc に対して CHILDID_SELF を渡して get_accParent を呼び出し、endID の親の IAccessible インターフェイスポインターを取得します。 次に、その IAccessible インターフェイスポインターに対して endID を渡して get_accChild を呼び出します。get_accChild で説明されている通常の手順に従います。
pStartAcc, CHILDID_SELF VT_DISPATCH pEndAcc pEndAcc について、IDispatch インターフェイスポインターを IAccessible インターフェイスポインターに変換する標準的な手順を使用します。
 

次の表は、ナビゲーションフラグ NAVDIR_FIRSTCHILD および NAVDIR_LASTCHILD について説明します。単純な要素は子を持てないため、開始点が単純な要素である場合の最初または最後の子への移動に関する項目は含まれていません。

開始点 返される結果 戻り値に対する後処理
pStartAcc, CHILDID_SELF VT_I4 endID pStartAcc に対して endID を渡して get_accChild を呼び出します。get_accChild で説明されている通常の手順に従います。
pStartAcc, CHILDID_SELF VT_DISPATCH pEndAcc pEndAcc について、IDispatch インターフェイスポインターを IAccessible インターフェイスポインターに変換する標準的な手順を使用します。
 

詳細については、オブジェクトナビゲーションのプロパティおよびメソッド を参照してください。

サーバーの例

次の例は、リスト項目が子要素であるカスタムリストボックスに対する、このメソッドの実装例を示しています。

// m_pControl is the control that returns this accessible object. 
// m_pStdAccessibleObject is the standard accessible object for the window 
//    that contains the control. 

HRESULT STDMETHODCALLTYPE AccServer::accNavigate( 
    long navDir,
    VARIANT varStart,
    VARIANT *pvarEndUpAt)
{
    // Default value. 
    pvarEndUpAt->vt = VT_EMPTY;

    if (varStart.vt != VT_I4)
    {
        return E_INVALIDARG;
    }

    switch (navDir)
    {
    case NAVDIR_FIRSTCHILD:
        if (varStart.lVal == CHILDID_SELF)
        {
            pvarEndUpAt->vt = VT_I4;
            pvarEndUpAt->lVal = 1;
        }
        else  // Starting with child. 
        {
            return S_FALSE;
        }
        break;

    case NAVDIR_LASTCHILD:
        if (varStart.lVal == CHILDID_SELF)
        {
            pvarEndUpAt->vt = VT_I4;
            pvarEndUpAt->lVal = m_pControl->GetCount();
        }
        else  // Starting with child.           
        {
            return S_FALSE;
        }
        break;

    case NAVDIR_NEXT:   
    case NAVDIR_DOWN:
        if (varStart.lVal != CHILDID_SELF)
        {
            pvarEndUpAt->vt = VT_I4;
            pvarEndUpAt->lVal = varStart.lVal + 1;
            // Out of range. 
            if (pvarEndUpAt->lVal > m_pControl->GetCount())
            {
                pvarEndUpAt->vt = VT_EMPTY;
                return S_FALSE;
            }
        }
        else  // Call through to method on standard object. 
        {
            return m_pStdAccessibleObject->accNavigate(navDir, varStart, pvarEndUpAt);
        }
        break;

    case NAVDIR_PREVIOUS:
    case NAVDIR_UP:
        if (varStart.lVal != CHILDID_SELF)
        {
            pvarEndUpAt->vt = VT_I4;
            pvarEndUpAt->lVal = varStart.lVal - 1;
            // Out of range. 
            if (pvarEndUpAt->lVal <1)
            {
                pvarEndUpAt->vt = VT_EMPTY;
                return S_FALSE;
            }
        }
        else  // Call through to method on standard object. 
        {
            return m_pStdAccessibleObject->accNavigate(navDir, varStart, pvarEndUpAt);
        }
        break;

     // Unsupported directions. 
    case NAVDIR_LEFT:
    case NAVDIR_RIGHT:
        if (varStart.lVal == CHILDID_SELF)
        {
            return m_pStdAccessibleObject->accNavigate(navDir, varStart, pvarEndUpAt);
        }
        else 
        {
            pvarEndUpAt->vt = VT_EMPTY;
            return S_FALSE;
        }
        break;
    }
    return S_OK;
};

vtbl 24 HRESULT accHitTest(INT xLeft, INT yTop, VARIANT* pvarChild)

IAccessible::accHitTest メソッドは、画面上の特定の点に表示されている子要素または子オブジェクトを取得します。

xLeftINTinヒットテストされる点の画面座標を指定します。x 座標は左から右へ増加します。画面座標を使用する場合、原点は画面の左上隅であることに注意してください。
yTopINTinヒットテストされる点の画面座標を指定します。y 座標は上から下へ増加します。画面座標を使用する場合、原点は画面の左上隅であることに注意してください。
pvarChildVARIANT*out

[out, retval] xLeftyTop で指定された点に表示されているオブジェクトを識別する VARIANT のアドレスです。pvarID で返される情報は、accHitTest メソッドが呼び出されているオブジェクトに対する、指定された点の位置に依存します。

点の位置 vt メンバー 値メンバー
オブジェクトの境界の外側で、オブジェクトの外接する四角形の内側または外側のいずれか。 VT_EMPTY なし。
オブジェクト内であるが、子要素または子オブジェクト内ではない。 VT_I4 lValCHILDID_SELF です。
子要素内。 VT_I4 lVal は子 ID を含みます。
子オブジェクト内。 VT_DISPATCH pdispVal には、子オブジェクトの IDispatch インターフェイスポインターが設定されます

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
S_FALSE
点はオブジェクトの境界の外側にあります。pvarIDvt メンバーは VT_EMPTY です。
DISP_E_MEMBERNOTFOUND
オブジェクトはこのメソッドをサポートしていません。
E_INVALIDARG
引数が無効です。
 

クライアント開発者向けの注意:  pvarIDvt メンバーが VT_EMPTY の場合、サーバーは S_FALSE を返しますが、クライアントは pvarID->vt が VT_EMPTY で戻り値が S_OK である場合も処理する必要があります。

解説(Remarks)

テスト対象の点がオブジェクトの子の 1 つの上にあり、その子自体が IAccessible インターフェイスをサポートしている場合、このメソッドは IAccessible インターフェイスポインターを返す必要があります。ただし、クライアントは IAccessible インターフェイスポインターまたは子 ID のいずれかを処理できるように準備しておく必要があります。詳細については、パラメーターでの子 ID の使用方法 を参照してください。

accLocation は外接する四角形を返すため、その四角形内のすべての点がオブジェクトの実際の境界内にあるとは限りません。外接する四角形内の一部の点は、オブジェクト上にない場合があります。1 つの項目がアイコン用の四角形とアイコンのテキスト用の別の四角形を持つ、大きいアイコンモードのリストビュー項目のような四角形以外のオブジェクトの場合、IAccessible::accLocation で取得したオブジェクトの外接する四角形の座標は、accHitTest でテストすると失敗することがあります。

他の IAccessible のメソッドや関数と同様に、ユーザーの操作によってクライアントが IAccessible インターフェイスポインターに対するエラーを受け取ることがあります。詳細については、IAccessible インターフェイスポインターに対するエラーの受け取り を参照してください。

特定の状況でこのメソッドを使用する場合、追加の使用上の注意が適用されます。詳細については、ヒットテストと画面上の位置によるナビゲーション を参照してください。

サーバーの例

次のサンプルコードは、カスタムリストボックスに対する実装例を示しています。

// m_pControl is the control that returns this accessible object. 
// m_hwnd is the HWND of the control window. 
//  
HRESULT STDMETHODCALLTYPE AccServer::accHitTest( 
    long xLeft,
    long yTop,
    VARIANT *pvarChild) 

{
    POINT pt;
    pt.x = xLeft;
    pt.y = yTop;

    // Not in our window. 
    if (WindowFromPoint(pt) != m_hwnd)
    {
        pvarChild->vt = VT_EMPTY;
        return S_FALSE;
    }

    else  // In our window; return list item, or self if in blank space. 
    {
        pvarChild->vt = VT_I4;
        ScreenToClient(m_hwnd, &pt);
        // IndexFromY returns the 0-based index of the item at that point, 
        // or -1 if the point is not on any item.
        int index = m_pControl->IndexFromY(pt.y);
        if (index >= 0)
        {
            // Increment, because the child array is 1-based. 
            pvarChild->lVal = index + 1;
        }
        else
        {
            pvarChild->lVal = CHILDID_SELF;

        }
        return S_OK;
    }
};

クライアントの例

次のサンプル関数は、pAcc が表すリスト内で、画面上の指定された点にある項目を選択します。単一選択を想定しています。

HRESULT SelectItemAtPoint(IAccessible* pAcc, POINT point)
{
    if (pAcc == NULL)
    {
        return E_INVALIDARG;
    }
    VARIANT varChild;

    HRESULT hr = pAcc->accHitTest(point.x, point.y, &varChild);        
    if ((hr == S_OK) && (varChild.lVal != CHILDID_SELF))
    {
        return pAcc->accSelect((SELFLAG_TAKEFOCUS | SELFLAG_TAKESELECTION), varChild);
    }
    return S_FALSE;
}
vtbl 25 HRESULT accDoDefaultAction(VARIANT varChild)

IAccessible::accDoDefaultAction メソッドは、指定されたオブジェクトの既定のアクションを実行します。すべてのオブジェクトが既定のアクションを持つわけではありません。

varChildVARIANTin既定のアクションが、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 VARIANT の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。

エラー 説明
DISP_E_MEMBERNOTFOUND
オブジェクトはこのメソッドをサポートしていません。この値は、編集フィールドなどアクションを実行しないコントロールに対して返されます。
E_INVALIDARG
引数が無効です。

解説(Remarks)

クライアントは、IAccessible::get_accDefaultAction を呼び出すことで、オブジェクトの既定のアクションを説明する文字列を取得します。

クライアント開発者向けの注意:  標準のシステムメニューのメニュー項目に対して使用した場合、アクセスキー(メニュー項目名のテキスト内の下線付きの文字。ニーモニックとも呼ばれます)に使用されている文字が ?、!、@、またはその他の SHIFT キーや別の修飾キーを必要とする文字である場合、accDoDefaultActionS_OK を返しますが、アクションの実行には失敗します。これは、ALT GR キーを押す必要があるアクセスキー文字を持つ各国語キーボードでも発生します。これは、Microsoft Office や Windows Internet Explorer などの他のアプリケーションのメニューでは問題になりません。アクセスキーの詳細については、IAccessible::get_accKeyboardShortcut を参照してください。

また、accDoDefaultAction はすぐに戻ることになっていますが、一部の実装では戻りをブロックします。たとえば、リンクをクリックするとダイアログが表示される場合、一部の実装はダイアログが閉じられるまで戻りをブロックします。このような遅延は、クライアントアプリケーションがダイアログボックスを処理できなくする可能性があります。サーバーは、戻りをブロックする実装を避けるべきです。

サーバーの例

次の例は、既定のアクションが子項目のダブルクリックであるカスタムリストコントロールに対する実装例を示しています。ブロックを防ぐため、このメソッドはカスタムメッセージをポストし、コントロールウィンドウがそれを受信すると、項目のプロパティの表示などのアクションがトリガーされます。

// Assume a previous definition such as this: 
// #define CUSTOMLB_DEFERDOUBLECLICK   (WM_USER + 1) 

HRESULT STDMETHODCALLTYPE AccServer::accDoDefaultAction( 
    VARIANT varChild) 
{
    if (varChild.vt != VT_I4)
    {
        return E_INVALIDARG;
    }
    if (varChild.lVal != CHILDID_SELF)
    {
        // It is assumed that the control does its own checking to see which 
        // item has the focus when it receives this message.
        PostMessage(m_hwnd, CUSTOMLB_DEFERDOUBLECLICK, 0, 0);
    }
    return S_OK;
};

クライアントの例

次のサンプル関数は、コントロールに対して既定のアクションを実行します。

HRESULT DoAction(IAccessible* pAcc)
{
        VARIANT varId;
        varId.vt = VT_I4;
        varId.lVal = CHILDID_SELF;
        return pAcc->accDoDefaultAction(varId);
}
vtbl 26 HRESULT put_accName(VARIANT varChild, LPWSTR szName)

IAccessible::put_accName メソッドは、現在はサポートされていません。クライアントアプリケーションは、SetWindowText 関数などのコントロール固有の回避策を使用してください。サーバーは E_NOTIMPL を返す必要があります。

varChildVARIANTinサポートされていません。
szNameLPWSTRinサポートされていません。

戻り値

サポートされていません。

vtbl 27 HRESULT put_accValue(VARIANT varChild, LPWSTR szValue)

IAccessible::put_accValue メソッドは、指定されたオブジェクトの値を設定します。すべてのオブジェクトが値を持つわけではありません。

varChildVARIANTin設定される値の情報が、オブジェクトのものか、オブジェクトの子要素の 1 つのものかを指定します。 このパラメーターは、CHILDID_SELF(オブジェクトに情報を設定する場合)か、子 ID(オブジェクトの子要素に関する情報を設定する場合)のいずれかです。 VARIANT 構造体 の初期化の詳細については、パラメーターでの子 ID の使用方法 を参照してください。
szValueLPWSTRinオブジェクトの値を含む、ローカライズされた文字列です。

戻り値

型: HRESULT

成功した場合は S_OK を返します。

失敗した場合は、次の表に示すいずれかの値、またはその他の標準的な COM エラーコード を返します。サーバーはこれらの値を返しますが、クライアントは出力パラメーターが有効な値を含んでいることを必ず確認する必要があります。詳細については、IAccessible の戻り値の確認 を参照してください。

エラー 説明
DISP_E_MEMBERNOTFOUND
オブジェクトはこのプロパティをサポートしていません。
E_INVALIDARG
引数が無効です。

解説(Remarks)

IAccessible::put_accValue メソッドは、一部の UI 要素(通常は編集コントロール)でサポートされています。このメソッドをサポートしない UI 要素については、代わりにコントロール固有のメソッドが使用されます。詳細については、サポートされるユーザーインターフェイス要素のリファレンス を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IAccessible "{618736E0-3C3D-11CF-810C-00AA00389B71}"
#usecom global IAccessible IID_IAccessible "{}"
#comfunc global IAccessible_get_accParent            7 sptr
#comfunc global IAccessible_get_accChildCount        8 var
#comfunc global IAccessible_get_accChild             9 int,sptr
#comfunc global IAccessible_get_accName              10 int,var
#comfunc global IAccessible_get_accValue             11 int,var
#comfunc global IAccessible_get_accDescription       12 int,var
#comfunc global IAccessible_get_accRole              13 int,var
#comfunc global IAccessible_get_accState             14 int,var
#comfunc global IAccessible_get_accHelp              15 int,var
#comfunc global IAccessible_get_accHelpTopic         16 var,int,var
#comfunc global IAccessible_get_accKeyboardShortcut  17 int,var
#comfunc global IAccessible_get_accFocus             18 var
#comfunc global IAccessible_get_accSelection         19 var
#comfunc global IAccessible_get_accDefaultAction     20 int,var
#comfunc global IAccessible_accSelect                21 int,int
#comfunc global IAccessible_accLocation              22 var,var,var,var,int
#comfunc global IAccessible_accNavigate              23 int,int,var
#comfunc global IAccessible_accHitTest               24 int,int,var
#comfunc global IAccessible_accDoDefaultAction       25 int
#comfunc global IAccessible_put_accName              26 int,wstr
#comfunc global IAccessible_put_accValue             27 int,wstr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。