Проблема доступности ListView - как заставить Windows Narrator читать всю выбранную строку, включая подпункты?

Я пытаюсь добавить поддержку специальных возможностей для элемента управления WC_LISTVIEW в моем приложении Win32/MFC. Я использую инструмент Windows Narrator в Windows 10, чтобы проверить результаты. И по умолчанию он читает только имя основного элемента выбранной строки. Например, в этом случае:

введите описание изображения здесь

он будет читать только страну, когда мне нужно прочитать всю строку.

Итак, я обнаружил, что могу установить аннотацию сервера для элемента управления представления списка, используя этот пример.

Я бы сначала настроил это так:

CAccPropServer_ListView* pMyPropSrv = NULL;
HRESULT hr;

CComPtr<IAccPropServices> pAccPropSvc = NULL;
hr = ::CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, IID_IAccPropServices, (void **)&pAccPropSvc);
if(SUCCEEDED(hr) &&
    pAccPropSvc )
{
    pMyPropSrv = new (std::nothrow) CAccPropServer_ListView( pAccPropSvc );
    if( pMyPropSrv )
    {

        MSAAPROPID propids[] = {
            PROPID_ACC_NAME,
        };

        hr = pAccPropSvc->SetHwndPropServer( hWndListCtrl, OBJID_CLIENT,
            CHILDID_SELF, propids, 1, pMyPropSrv, ANNO_CONTAINER);

        pMyPropSrv->Release();
    }
}

где CAccPropServer_ListView класс делает всю работу:

class CAccPropServer_ListView: public IAccPropServer
{
    ULONG               m_Ref;
    IAccPropServices *  m_pAccPropSvc;

public:

    CAccPropServer_ListView( IAccPropServices * pAccPropSvc )
        : m_Ref( 1 ),
          m_pAccPropSvc( pAccPropSvc )
    {
        m_pAccPropSvc->AddRef();
    }

    ~CAccPropServer_ListView()
    {
        m_pAccPropSvc->Release();
    }


    /* TODO: Addref/Release/QI go here...
           Skipped them for brevity...
     */


    HRESULT STDMETHODCALLTYPE GetPropValue (const BYTE * pIDString,
        DWORD dwIDStringLen, MSAAPROPID idProp, VARIANT * pvarValue,
        BOOL * pfGotProp )
    {
        if(!pfGotProp)
            return E_POINTER;

        pvarValue->vt = VT_EMPTY;
        *pfGotProp = FALSE;

        HWND  hwnd;
        DWORD idObject;
        DWORD idChild;

        if( S_OK != m_pAccPropSvc->DecomposeHwndIdentityString( pIDString, 
                  dwIDStringLen, &hwnd, &idObject, &idChild ) )
        {
            return S_OK;
        }

        if( idChild != CHILDID_SELF )
        {
            if( idProp == PROPID_ACC_NAME )
            {
                CString str;
                str.Format(L"Line index %d", idChild);

                BSTR bstr = ::SysAllocString((LPCTSTR)str.GetString());
                pvarValue->vt = VT_BSTR;
                pvarValue->bstrVal = bstr;

                *pfGotProp = TRUE;
            }
        }

        return S_OK;
    }



};

Так что мой вопрос касается GetPropValue метод выше, который фактически генерирует текстовое приглашение для рассказчика, чтобы прочитать вслух.

Как получить индекс строки, прочитанной Рассказчиком из idChild что возвращается DecomposeHwndIdentityString?

В моем примере выше, чисто экспериментально, я получил следующие значения:

"Line index 17"
"Line index 33"
"Line index 49"
"Line index 65"
and so on

что бы перевести на 0x11, 0x21, 0x31, 0x41 это не индексы строк. Эти идентификаторы задокументированы где-либо для SysListView32?

0 ответов

Другие вопросы по тегам