Microsoft Active Accessibility - это технология, которая предоставляет информацию об объектах на экране для вспомогательных средств, таких как читалки экранов (screen readers). Но это не означает, что только читалки экранов могут использовать её.
Вот программа, которая показывает использование Active Accessibility на самом зачаточном уровне: чтение текста. В Active Accessibility есть намного больше всего, чем только чтение текста. Вы можете перемещаться по объектам на экране, читать различные свойства, даже ссылаться на команды по ним - и всё это программно.
Создайте новое приложение, положите на форму метку и таймер, и напишите такой обработчик OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject); begin RecalcText; Label1.Caption := g_pszText; end;Конечно же, самая интересная часть заключена в процедуре RecalcText, которая получает текст под курсором мыши:
private { Private declarations } g_pszText: String; g_pt: TPoint; procedure RecalcText; end; ... uses OleAcc; function AccessibleObjectFromPoint(ptScreen: TPoint; out ppacc: IAccessible; out pvarChild: Variant): HRESULT; stdcall; external 'oleacc.dll'; procedure TForm1.RecalcText; var pt: TPoint; pacc: IAccessible; vtChild: Variant; bsName, bsValue: WideString; begin if GetCursorPos(pt) and ((pt.x <> g_pt.x) or (pt.y <> g_pt.y)) then begin g_pt := pt; if (SUCCEEDED(AccessibleObjectFromPoint(pt, pacc, vtChild))) then try bsName := ''; bsValue := ''; pacc.get_accName(vtChild, bsName); pacc.get_accValue(vtChild, bsValue); g_pszText := 'Name: ' + bsName + #13#10'Value: ' + bsValue; finally VarClear(vtChild); pacc := nil; end; end; end;Давайте посмотрим на эту функцию. Мы начинаем с того, что берём позицию мышиного курсора и смотрим: изменился ли он с последнего раза. Если да - тогда мы просим функцию AccessibleObjectFromPoint найти нам объект по этим координатам и вернуть экземпляр IAccessible плюс идентификатор потомка (child). Эти два кусочка информации и представляют объект под курсором.
В итоге всё сводится к простому запросу имени (get_accName) и значения (get_accValue) объекта и показе их на форме.
Для получения дальнейшей информации о accessibility - почитайте сайт Сары Форд, в частности, сообщение What is Assistive Technology Compatibility.
Читать далее.
Вот ещё пример работы с IAccessible из Delphi.
ОтветитьУдалитьНельзя ли убрать номера строк и зеленую полоску из блоков кода? Очень уж неудобно копипастить :)
ОтветитьУдалитьСправа-вверху должна быть кнопенька копирования в буфер. Не видно?
ОтветитьУдалитьМне самому не нравится, что не работает как надо по Ctrl + C, но красиво выстроенную нумерацию строк тоже охота иметь.
Да, действительно кнопка есть. В фаерфоксе выдает диалог с кнопкой ОК, что все скопировано :)
ОтветитьУдалитьУ меня в опере нет никакой кнопки, однако, текст выделяется и так, и так. Хочешь - с цифрами, хочешь - без. :)
ОтветитьУдалитьПо теме: некоторые "тексты" недоступны. Например, перемещаю курсор над этой страничкой - все строки статьи определяются. А когда перемещаю его над кодом примера - Name и Value пусты.
То же самое, например, если жму выпадающее меню, в опере. Пункт головного меню пишется, а в выпадающем - Name и Value пустые :(
почему так? Не все объекты выдают своё имя и значение, функциями pacc.get_accName и pacc.get_accValue?
>>> У меня в опере нет никакой кнопки, однако, текст выделяется и так, и так. Хочешь - с цифрами, хочешь - без. :)
ОтветитьУдалитьКак-бы прошёл год и плагин подсветки обновился.
>>> почему так? Не все объекты выдают своё имя и значение, функциями pacc.get_accName и pacc.get_accValue?
См. ссылку в посте: Читать далее.
Не заметил ссылку :) спасибо!
ОтветитьУдалитьПолучается, ничего не сделать, хреновастенько работает :( в программе, где это мне требуется тишина практически на всех контролах
Lingvo 12й свои всплывающие подсказки выдаёт, похоже, абсолютно везде. Наверное, текст распознают. Придётся что-то подобное писать :(
херня редкостная, а не перевод
ОтветитьУдалитьЗачем изуродовано из C в Делфи???
ОтветитьУдалитьможет кому пригодится
ОтветитьУдалить