Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Работа с метаданными MP3-файлов на Ассемблере

23.11.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с метаданными MP3-файлов на Ассемблере

Во многих файлах, в частности музыкальных и видео, присутствуют особые блоки данных, так называемые метаданные или теги. Метаданные содержат информацию о названии композиции и альбома, имени исполнителя, жанре, номере трека и т.п. Их используют программные и аппаратные проигрыватели, каталогизаторы и другие средства для работы с мультимедийными файлами. Давайте посмотрим, как можно получить теги из MP3-файла или изменить их средствами самой системы без ручного парсинга внутренней структуры файла.

Читать статью целиком »
Просмотров: 1015 | Комментариев: 5

Управление громкостью звука в системе

15.11.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Управление громкостью звука в системе

Сегодня разберем пример, как программно изменить громкость звука в Windows. В старых версиях Windows для этого использовались waveform-функции с очень неудобными параметрами. Управлять громкостью с помощью эмуляции мультимедийных клавиш тоже не самое лучшее решение. Но, к счастью, прогресс не стоит на месте.

Читать статью целиком »
Просмотров: 1422 | Комментариев: 9

Получение списка программ, закрепленных на панели задач

15.04.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из старых статей о работе с панелью задач я написал, что узнать список закрепленных программ можно перебором ярлыков в папке %APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar. Действительно, это можно сделать и так, но лучше делать это правильно, с использованием предназначенных для этого COM-интерфейсов системы. Начнем с описания констант, GUID и интерфейсов, которые нам понадобятся для работы.
  1. CLSCTX_INPROC_SERVER    = 1
  2. S_OK                    = 0
  3.  
  4. ; Windows Vista
  5. ; GUID {C3C6EB6D-C837-4EAE-B172-5FEC52A2A4FD}
  6. IID_IPinnedList dd 0C3C6EB6Dh
  7.                 dw 0C837h
  8.                 dw 04EAEh
  9.                 db 0B1h, 072h, 05Fh, 0ECh, 052h, 0A2h, 0A4h, 0FDh
  10.  
  11. ; Windows 7, 8, 8.1
  12. ; GUID {BBD20037-BC0E-42F1-913F-E2936BB0EA0C}
  13. IID_IPinnedList2 dd 0BBD20037h
  14.                  dw 0BC0Eh
  15.                  dw 042F1h
  16.                  db 091h, 03Fh, 0E2h, 093h, 06Bh, 0B0h, 0EAh, 00Ch
  17.  
  18. ; Windows 10 build 1809+
  19. ; GUID {0DD79AE2-D156-45D4-9EEB-3B549769E940}
  20. IID_IPinnedList3 dd 00DD79AE2h
  21.                  dw 0D156h
  22.                  dw 045D4h
  23.                  db 09Eh, 0EBh, 03Bh, 054h, 097h, 069h, 0E9h, 040h
  24.  
  25. ; IID_IPinnedList Interface
  26. struct IPinnedList
  27.     ; IUnknown
  28.     QueryInterface dd ?   ; 000h
  29.     AddRef         dd ?   ; 004h
  30.     Release        dd ?   ; 008h
  31.     ; IPinnedList
  32.     EnumObjects    dd ?   ; 00Ch
  33.     Modify         dd ?   ; 010h
  34.     GetChangeCount dd ?   ; 014h
  35.     IsPinnable     dd ?   ; 018h
  36.     Resolve        dd ?   ; 01Ch
  37.     IsPinned       dd ?   ; 020h
  38. ends
  39.  
  40. ; GUID {90AA3A4E-1CBA-4233-B8BB-535773D48449}
  41. CLSID_TaskbarPin dd 090AA3A4Eh
  42.                  dw 01CBAh
  43.                  dw 04233h
  44.                  db 0B8h, 0BBh, 053h, 057h, 073h, 0D4h, 084h, 049h
  45.  
  46. ; IID_IEnumFullIDList Interface
  47. struct IEnumFullIDList
  48.     ; IUnknown
  49.     QueryInterface dd ?
  50.     AddRef         dd ?
  51.     Release        dd ?
  52.     ; IEnumFullIDList
  53.     Next           dd ?
  54.     Skip           dd ?
  55.     Reset          dd ?
  56.     Clone          dd ?
  57. ends
Как это ни странно, интерфейсы IPinnedList и их методы относятся к недокументированным и информации по ним в интернете практически нет. Для Windows 7-8 используется интерфейс IPinnedList2, а для Windows 10 сборки 1809 и выше нужен интерфейс IPinnedList3. Можно заморочиться даже для Windows Vista, там используется интерфейс IPinnedList. Для получения списка закрепленных приложений нам потребуется только один метод - EnumObjects, к счастью, во всех трех интерфейсах он совпадает.

Читать статью целиком »
Просмотров: 970 | Комментариев: 0

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

18.11.2020 | Категория: Образ мышления: 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] -> код роли объекта (кнопка, полоса прокрутки, текст и т.п.)
Роль зависит от типа элемента интерфейса. Это может быть текст, заголовок окна, пункт меню, полоса прокрутки, кнопка, чекбокс, клиентская область окна и так далее. На основании этих данных вспомогательное устройство принимает решение, каким образом можно взаимодействовать с объектом под курсором и какие данные от него можно ожидать.

Читать статью целиком »
Просмотров: 987 | Комментариев: 0

Управление отображением программы на панели задач

07.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
При скрытии главного окна программы при помощи функции ShowWindow, программа также убирается с панели задач. Тут ничего сложного. А как сделать так, чтобы окно отображалось на экране, но при этом программа не отображалась на панели задач? В некоторых случаях это можно сделать определенной комбинацией стилей окна, например, добавив в расширенный стиль параметр WS_EX_TOOLWINDOW. Но это не всегда приемлемо, чаще всего стиль окна должен оставаться привычным, то есть с заголовком, иконкой, кнопками сворачивания и т.д. Значит нужны программные способы добавить или убрать программу с панели задач.

Наиболее простой в реализации способ, который чаще всего рекомендуют использовать, основан на изменении родительского окна. Если у главного окна приложения нет родительского окна, то оно отображается на панели задач. Если в качестве родительского окна указан рабочий стол, то программа убирается из панели задач. На этапе инициализации окна ему присваивается нулевое значение в качестве хэндла родительского окна.
  1. .wminitdialog:
  2.         ; Если окно уже имеет родителя, то сбросить значение
  3.         invoke  GetWindowLong,[hwnddlg],GWL_HWNDPARENT
  4.         or      eax,eax
  5.         jz      @f
  6.         invoke  SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
  7. @@:
Затем при наступлении нужных событий программа или отображается на панели задач, или скрывается.
  1. .taskbar_show:
  2.         ; Добавить программу на панели задач
  3.         invoke  SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
  4.         ...
  5. .taskbar_hide:
  6.         ; Убрать программу с панели задач
  7.         invoke  GetDesktopWindow
  8.         invoke  SetWindowLong,[hwnddlg],GWL_HWNDPARENT,eax
  9.         ...
Если нужно с самого начала просто убрать программу из панели задач, то при инициализации окна вместо обнуления родительского хэндла на эту роль сразу назначается рабочий стол.

Читать статью целиком »
Просмотров: 1226 | Комментариев: 9

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0092 сек.) / Память: 4.5 Mb
Наверх