Я пытаюсь добавить поддержку доступности к 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
?
Задача ещё не решена.
Других решений пока нет …