Blog. Just Blog

Как получить текст под курсором

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Технология Microsoft Active Accessibility предназначена для взаимодействия различных устройств типа экранных читалок с объектами на экране, чтобы облегчить работу с компьютером людям с ограниченными физическими возможностями. При помощи Microsoft Active Accessibility, например, можно узнать, над каким элементом экрана находится курсор мыши, а также получить тип и содержимое этого элемента. Этим мы и воспользуемся, чтобы получить текст под курсором.

С технологией MSAA мы уже познакомились в статье про перехват Alt+Tab, только не заостряли внимание, что это именно она. Зато не придется дублировать структуры и интерфейсы, они уже описаны в статье по ссылке. Поэтому сразу переходим к программированию.
  1.         ; Получить координаты курсора
  2.         invoke  GetCursorPos,curs
  3.         ; Получить объект под курсором
  4.         invoke  AccessibleObjectFromPoint,[curs.x],[curs.y],pAcc,varChild
По таймеру или по какому-то другому событию получаем текущие координаты курсора, затем при помощи функции AccessibleObjectFromPoint получаем объект, который находится на экране по этим координатам. В случае удачного вызова, она возвращает указатель на интерфейс IAccessible объекта. Теперь можно попробовать получить текст под курсором, но сперва небольшое отступление.
  1.         ; Получить роль объекта под курсором
  2.         mov     [role.vt],VT_I4
  3.         push    role
  4.         mov     eax,varChild
  5.         push    dword [eax+0Ch]
  6.         push    dword [eax+08h]
  7.         push    dword [eax+04h]
  8.         push    dword [eax]
  9.         mov     eax,[pAcc]
  10.         mov     eax,[eax]
  11.         stdcall dword [eax+IAccessible.get_accRole],[pAcc]
  12.         ; [role.lVal] -> код роли объекта (кнопка, полоса прокрутки, текст и т.п.)
Роль зависит от типа элемента интерфейса. Это может быть текст, заголовок окна, пункт меню, полоса прокрутки, кнопка, чекбокс, клиентская область окна и так далее. На основании этих данных вспомогательное устройство принимает решение, каким образом можно взаимодействовать с объектом под курсором и какие данные от него можно ожидать.

Возвращаемся к основной задаче - получение текста под курсором. Делается это через методы get_accName и get_accValue, причем одновременно. Для максимального эффекта можно также добавить метод get_accDescription. Ниже я поясню, почему так.
  1.         ; Создать строку
  2.         invoke  SysAllocString,szNull
  3.         mov     [bstrName],eax
  4.  
  5.         ; Получить название объекта под курсором
  6.         push    [bstrName]
  7.         mov     eax,varChild
  8.         push    dword [eax+0Ch]
  9.         push    dword [eax+08h]
  10.         push    dword [eax+04h]
  11.         push    dword [eax]
  12.         mov     eax,[pAcc]
  13.         mov     eax,[eax]
  14.         stdcall dword [eax+IAccessible.get_accName],[pAcc]
  15.         mov     eax,[bstrName]
  16.         mov     eax,[eax]
  17.         ; EAX -> строка названия
  18.  
  19.         ; Получить значение объекта под курсором
  20.         push    [bstrName]
  21.         mov     eax,varChild
  22.         push    dword [eax+0Ch]
  23.         push    dword [eax+08h]
  24.         push    dword [eax+04h]
  25.         push    dword [eax]
  26.         mov     eax,[pAcc]
  27.         mov     eax,[eax]
  28.         stdcall dword [eax+IAccessible.get_accValue],[pAcc]
  29.         mov     eax,[bstrName]
  30.         mov     eax,[eax]
  31.         ; EAX -> строка значения
  32.  
  33.         ; Получить описание объекта под курсором
  34.         push    [bstrName]
  35.         mov     eax,varChild
  36.         push    dword [eax+0Ch]
  37.         push    dword [eax+08h]
  38.         push    dword [eax+04h]
  39.         push    dword [eax]
  40.         mov     eax,[pAcc]
  41.         mov     eax,[eax]
  42.         stdcall dword [eax+IAccessible.get_accDescription],[pAcc]
  43.  
  44.         mov     eax,[bstrName]
  45.         mov     eax,[eax]
  46.         ; EAX -> строка описания
Термины "имя" и "значение" тут весьма условны. Так, для большинства объектов интерфейса в качестве имени будет их текстовое содержимое, а в качестве значения - пустая строка. В браузере Firefox для ссылок имя - название ссылки, а значение - адрес ссылки, для полей ввода имя пустое, а значение - содержимое поля ввода. В "описании" может быть системная или пользовательская подсказка элемента, а может и ничего не быть. Вариантов очень много, поэтому надо проверять наличие текста из всех источников.

Важно отметить, что получение текста под курсором будет работать не во всех программах. Поддержка Microsoft Active Accessibility в большинстве случаев возлагается на разработчиков приложений. Насколько хорошо она была реализована в программе, настолько хорошо и удобно можно будет получать текст из ее элементов. Например, в браузере Chrome "из коробки" поддержка MSAA вообще отключена из-за ресурсоемкости, включить ее можно по специальной ссылке chrome://accessibility.

Где это можно использовать? Например, для захвата статического текста из окон приложений, для получения данных из списков без необходимости выделения памяти в чужих процессах, для автоматического извлечения текстов с веб-страниц и их элементов, для обхода всяких защит от копирования. Это только первое, что приходит мне на ум, а возможностей у Microsoft Active Accessibility гораздо больше.

В приложении пример программы с исходным текстом, которая получает содержимое элемента, находящегося под курсором.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Get.Text.Under.Cursor.Demo.zip (6,490 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1213 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0055 сек.) / Память: 4.5 Mb
Наверх