Подтвердить что ты не робот

Какое правильное решение поддерживает интерфейс IAccesible для перемещения каретки в текстовых редакторах?

Я хочу реализовать текстовый редактор с нуля, который поддерживает интерфейс 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;
}
4b9b3361

Ответ 1

Клиент будет использовать функцию SetWinEventHook() для отслеживания следующих событий каретки:

  • EVENT_OBJECT_CREATE
  • EVENT_OBJECT_DESTROY
  • EVENT_OBJECT_SHOW
  • EVENT_OBJECT_HIDE
  • EVENT_OBJECT_LOCATIONCHANGE
  • EVENT_OBJECT_FOCUS

Если вы используете настраиваемый элемент управления, вам необходимо использовать NotifyWinEvent() для запуска этих событий самостоятельно, особенно EVENT_OBJECT_LOCATIONCHANGE, который должен вызывать повествование.

Когда клиент обрабатывает события thoses, он должен получить доступ к интерфейсу IAccessible объекта, который он отслеживает, используя AccessibleObjectFromEvent().

Как вы говорите, Microsoft Active Accessibility обработала бы этот вызов и отправила сообщение WM_GETOBJECT в соответствующее окно в зависимости от обработчика, предоставленного AccessibleObjectFromEvent() (который должен быть обработчиком, содержащимся в событии).

Когда вы получаете WM_GETOBJECT для каретки, вы должны вернуть соответствующий интерфейс IAccessible, который будет сообщать о соответствующих accRole и accLocation.

Если вы не получили правильное сообщение WM_GETOBJECT, это может быть связано с тем, что вы не вызываете правильные события.

Вы можете использовать доступный наблюдатель событий, чтобы проверить, отправлены ли правильные события: http://msdn.microsoft.com/en-us/library/windows/desktop/dd317979%28v=vs.85%29.aspx

См. Руководство разработчика для серверов Active Accessibility на MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd318053%28v=vs.85%29.aspx

Edit

Кроме того, если вы используете стандартный карет, предоставленный Riched20.dll(в экземпляре Rich Edit as), в документации указывается, что в отличие от других элементов пользовательского интерфейса он не имеет связанного с ним дескриптора окна.