Blog. Just Blog

Как получить список подсказок у иконок в трее

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня снова будем издеваться над треем. На этот раз для доступа к данным в трее будем использовать средства интерфейса IAccessible, ранее мы его уже применяли, но немного для других задач.

Структуры, константы, интерфейсы и все остальное уже расписано в статье по ссылке выше, дублировать не буду. Как пройтись по иерархии окон Проводника и получить хэндл трея с иконками тут тоже было немало примеров. Переходим к основной части.
  1.         ; Получить информацию о выбранном элементе
  2.         ; [hTray] - хэндл окна трея с иконками
  3.         invoke  AccessibleObjectFromWindow,[hTray],OBJID_CLIENT,\
  4.                 CLSID_IAccessible,pAcc
  5.  
  6.         ; Количество элементов в окне
  7.         mov     eax,[pAcc]
  8.         mov     eax,[eax]
  9.         stdcall dword [eax+IAccessible.get_accChildCount],[pAcc],tmp
  10.  
  11.         invoke  wsprintf,buff,mask1,[tmp]
  12.         add     esp,12
  13.         stdcall AddLog,[hwmain],ID_LOG,buff
  14.  
  15.         ; Начинаем перебирать с 1 элемента
  16.         mov     ebx,1
  17. loc_loop:
  18.         ; Выделить память под строку
  19.         invoke  SysAllocString,szNull
  20.         mov     [bstrName],eax
  21.  
  22.         ; Получить название выбранного элемента
  23.         push    [bstrName]
  24.         mov     [varChild.vt],VT_I4
  25.         mov     [varChild.lVal],ebx
  26.         mov     eax,varChild
  27.         push    dword [eax+0Ch]
  28.         push    dword [eax+08h]
  29.         push    dword [eax+04h]
  30.         push    dword [eax]
  31.         mov     eax,[pAcc]
  32.         mov     eax,[eax]
  33.         stdcall dword [eax+IAccessible.get_accName],[pAcc]
  34.  
  35.         ; Строка подсказки
  36.         mov     eax,[bstrName]
  37.         mov     eax,[eax]
  38.         ; EAX -> строка подсказки
  39.  
  40.         ; Прибраться за собой
  41.         invoke  SysFreeString,[bstrName]
  42.  
  43.         ; Следующий элемент
  44.         inc     ebx
  45.         cmp     ebx,[tmp]
  46.         jbe     loc_loop
  47.  
  48.         ; Прибраться за собой
  49.         mov     eax,[pAcc]
  50.         mov     eax,[eax]
  51.         stdcall dword [eax+IAccessible.Release],[pAcc]
С помощью функции AccessibleObjectFromWindow получаем интерфейс IAccessible для окна трея. С помощью метода get_accChildCount определяем количество дочерних элементов окна, они же иконки в трее, в том числе и скрытые. С помощью метода get_accName получаем текстовые строки с подсказками для каждого элемента, начиная с 1-го. Нулевому элементу соответствует само окно трея.

Список подсказок и количество иконок получать научились, теперь о практическом применении этого трюка. С точки зрения устройств для чтения с экрана все элементы трея имеют тип "Кнопка" с единственным действием "Нажать". А у интерфейса IAccessible есть интересный метод accDoDefaultAction, который в данном случае соответствует клику на выбранной иконке. Некоторые программы не поддерживают горячие клавиши и отображают свое окно только при нажатии иконки в трее. Так ведет себя, к примеру, десктопная версия Telegram: по хоткею в трей сворачивается, а обратно никак. Или, например, комбинация клавиш для активации окна какой-нибудь программы прибита гвоздями и конфликтует с другим приложением, но главное окно можно вызвать также кликом на иконку в трее. В перечисленных случаях можно написать микро-приложение, которое будет постоянно висеть в памяти, забиндит на себя удобные вам комбинации клавиш, при их нажатии пробежится по системному трею, по подсказкам или их характерным фрагментам определит нужное приложение и "кликнет" на его иконке.

В приложении пример программы с исходным текстом, которая получает список подсказок у иконок из системного трея, а в случае обнаружения иконки десктопной версии Telegram "кликнет" на ней.

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

Get.Tray.Tips.Demo.zip (4,491 bytes)


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

Метки: Assembler, COM

Комментарии

Отзывы посетителей сайта о статье
ManHunter (13.03.2024 в 15:36):
Опять же, это такое поведение трея с той позиции, как если бы его увидела экранная читалка. Программа не придумывает данные, пользуется стандартными функциями системы с не менее стандартным доступом к ним.
==DJ==[ZLO] (13.03.2024 в 15:30):
Может сморожу чушь но, я по расписанию запускаю Get.Tray.Tips и при этом открываю шторку в трее всего 8мь элементов в шторке три, после таймера выполняется Get.Tray.Tips и показывает 5ть. Хотя на экране 8мь. Вот что я имел ввиду.
ManHunter (06.03.2024 в 11:36):
Так это вполне ожидаемое поведение. Тут же работа выполяется через функции экранной читалки, а раз чего-то не видно на экране, то "прочитать" это не представляется возможным.
==DJ==[ZLO] (06.03.2024 в 09:42):
Спасибо, полезно. А те, которые за "шторкой" она не выводит (

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

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

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