Как получить текст под курсором
Технология Microsoft Active Accessibility предназначена для взаимодействия различных устройств типа экранных читалок с объектами на экране, чтобы облегчить работу с компьютером людям с ограниченными физическими возможностями. При помощи Microsoft Active Accessibility, например, можно узнать, над каким элементом экрана находится курсор мыши, а также получить тип и содержимое этого элемента. Этим мы и воспользуемся, чтобы получить текст под курсором.С технологией MSAA мы уже познакомились в статье про перехват Alt+Tab, только не заостряли внимание, что это именно она. Зато не придется дублировать структуры и интерфейсы, они уже описаны в статье по ссылке. Поэтому сразу переходим к программированию.
Code (Assembler) : Убрать нумерацию
- ; Получить координаты курсора
- invoke GetCursorPos,curs
- ; Получить объект под курсором
- invoke AccessibleObjectFromPoint,[curs.x],[curs.y],pAcc,varChild
Code (Assembler) : Убрать нумерацию
- ; Получить роль объекта под курсором
- mov [role.vt],VT_I4
- push role
- mov eax,varChild
- push dword [eax+0Ch]
- push dword [eax+08h]
- push dword [eax+04h]
- push dword [eax]
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.get_accRole],[pAcc]
- ; [role.lVal] -> код роли объекта (кнопка, полоса прокрутки, текст и т.п.)
Возвращаемся к основной задаче - получение текста под курсором. Делается это через методы get_accName и get_accValue, причем одновременно. Для максимального эффекта можно также добавить метод get_accDescription. Ниже я поясню, почему так.
Code (Assembler) : Убрать нумерацию
- ; Создать строку
- invoke SysAllocString,szNull
- mov [bstrName],eax
- ; Получить название объекта под курсором
- push [bstrName]
- mov eax,varChild
- push dword [eax+0Ch]
- push dword [eax+08h]
- push dword [eax+04h]
- push dword [eax]
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.get_accName],[pAcc]
- mov eax,[bstrName]
- mov eax,[eax]
- ; EAX -> строка названия
- ; Получить значение объекта под курсором
- push [bstrName]
- mov eax,varChild
- push dword [eax+0Ch]
- push dword [eax+08h]
- push dword [eax+04h]
- push dword [eax]
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.get_accValue],[pAcc]
- mov eax,[bstrName]
- mov eax,[eax]
- ; EAX -> строка значения
- ; Получить описание объекта под курсором
- push [bstrName]
- mov eax,varChild
- push dword [eax+0Ch]
- push dword [eax+08h]
- push dword [eax+04h]
- push dword [eax]
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.get_accDescription],[pAcc]
- mov eax,[bstrName]
- mov eax,[eax]
- ; EAX -> строка описания
Важно отметить, что получение текста под курсором будет работать не во всех программах. Поддержка Microsoft Active Accessibility в большинстве случаев возлагается на разработчиков приложений. Насколько хорошо она была реализована в программе, настолько хорошо и удобно можно будет получать текст из ее элементов. Например, в браузере Chrome "из коробки" поддержка MSAA вообще отключена из-за ресурсоемкости, включить ее можно по специальной ссылке chrome://accessibility.
Где это можно использовать? Например, для захвата статического текста из окон приложений, для получения данных из списков без необходимости выделения памяти в чужих процессах, для автоматического извлечения текстов с веб-страниц и их элементов, для обхода всяких защит от копирования. Это только первое, что приходит мне на ум, а возможностей у Microsoft Active Accessibility гораздо больше.
В приложении пример программы с исходным текстом, которая получает содержимое элемента, находящегося под курсором.
Просмотров: 1213 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария