Я хочу реализовать текстовый редактор с нуля, который поддерживает интерфейс IAccessible. Я использую API MFC и Win32.
Когда позиция каретки изменяется в стандартных текстовых редакторах, таких как "Блокнот", соответствующая буква, слово или строка для движения каретки выражаются клиентскими инструментами, такими как "Рассказчик", "JAWS" или т.д. Я не знаю, как реализовать эту функцию. Я ищу в Интернете и читаю документацию MSDN.
Я прочитал в http://msdn.microsoft.com/en-us/library/dd317978.aspx и http://msdn.microsoft.com/en-us/library/dd373892.aspx, что клиент запрашивает каретки методом AccessibleObjectFromWindow из ОС и ОС отправляют WM_GETOBJECT в приложение. Сообщения WM_GETOBJECT, полученные в соответствующей функции обратного вызова окна, но hWnd для события перемещения каретки - NULL. Я проверил очередь сообщений потока, но WM_GETOBJECT не получил вообще в очереди сообщений потока.
Один из методов, который работал несколько, но не правильное решение - вызвать
NotifyWinEvent( EVENT_OBJECT_NAMECHANGE, hwnd, OBJID_CLIENT, CHILDID_SELF )
когда карет перемещается пользователем. И когда клиент запрашивает измененное имя, я возвращаю соответствующий текст, относящийся к перемещению каретки.
HRESULT CMyEditor::get_accName(VARIANT varChild, BSTR *pszName)
{
*pszName = SysAllocString( L"CORESPONDING TEXT TO THE CARET MOVEMENT" );
return S_OK;
}