Проблема доступности 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
?