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

Я пытаюсь добавить поддержку доступности к WC_LISTVIEW управление в моем приложении Win32 / MFC. я использую Windows Рассказчик инструмент в 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?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector