Blog. Just Blog

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

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

Упаковка и распаковка данных с помощью библиотеки zlib

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

Упаковка и распаковка данных с помощью библиотеки zlib

Продолжаем тему упаковки и распаковки. Сегодня в качестве инструмента будет известная библиотека zlib от Jean-loup Gailly и Mark Adler, признанных профессионалов в области компрессии данных. Ну а что, по системным функциям прошлись, почему бы не пройтись по сторонним библиотекам. Тем более, что zlib используется во многих программных продуктах, и, если вдруг возникнет необходимость поковыряться в их базах, то будет уже практически готовое решение.

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

Работа с метаданными изображений с помощью GDI+

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

Работа с метаданными изображений с помощью GDI+

Библиотека Windows GDI+ предназначена для работы с графикой и мультимедиа и включает в себя более 600 различных функций для этого. Особо радует поддержка: все ключевые функции доступны уже начиная с Windows XP. Ранее мы уже немного касались этой темы. Сегодня разберем примеры, как средствами GDI+ можно получить метаданные из изображений различных форматов и изменить их.

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

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

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

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

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

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

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

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

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

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

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

Обработка колесика мыши над иконкой в трее

12.11.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
"По следам наших публикаций", как любили писать в советской прессе. В предыдущей статье я обещал рассказать, каким образом можно реализовать обработку вращения колесика мыши над иконкой в системном трее. Поскольку система не отправляет иконкам в трее сообщение WM_MOUSEWHEEL, обрабатывать его мы будем при помощи хуков и описанных в предыдущей статье методов определения, что курсор находится над нужной иконкой. Начнем с локального хука. Установка и снятие хука выполняется самым обычным способом, например:
  1. proc DialogProc hwnddlg,msg,wparam,lparam
  2.         push    ebx esi edi
  3.         cmp     [msg],WM_INITDIALOG
  4.         je      .wminitdialog
  5.         cmp     [msg],WM_CLOSE
  6.         je      .wmclose
  7.         ...
  8.         ...
  9.         xor     eax,eax
  10.         jmp     .finish
  11.  
  12. .wminitdialog:
  13.         ...
  14.         ...
  15.         ; Показать иконку в трее
  16.         invoke  Shell_NotifyIcon, NIM_ADD,node
  17.  
  18.         ; Установить обработчик мыши
  19.         invoke  GetCurrentThreadId
  20.         invoke  SetWindowsHookEx,WH_MOUSE,MousewheelProc,NULL,eax
  21.         mov     [hhkm],eax
  22.  
  23.         mov     eax,[hwnddlg]
  24.         mov     [hwmain],eax
  25.         jmp     .processed
  26.  
  27.         ...
  28.         ...
  29. .wmclose:
  30.         ; Снять обработчик мыши
  31.         invoke  UnhookWindowsHookEx,[hhkm]
  32.         ; Удалить иконку из трея
  33.         invoke  Shell_NotifyIcon,NIM_DELETE,node
  34.  
  35.         ; Закрыть окно
  36.         invoke  EndDialog,[hwnddlg],0
  37. .processed:
  38.         mov     eax,1
  39. .finish:
  40.         pop     edi esi ebx
  41.         ret
  42. endp
Обработчик событий мыши проверяет, что пришло сообщение WM_MOUSEWHEEL и что курсор в текущий момент находится над нужной иконкой в трее. Если эти условия выполнены, то проверяется направление вращения колесика и, в зависимости от этого, выполняются те или иные действия. Имейте в виду, что для сообщения WM_MOUSEWHEEL в обработчик хука приходит структура не MOUSEHOOKSTRUCT, а MOUSEHOOKSTRUCTEX с дополнительным полем mouseData.
  1. ; Структура для обработчика хука
  2. struct MOUSEHOOKSTRUCTEX
  3.         pt           POINT
  4.         hwnd         dd ?
  5.         wHitTestCode dd ?
  6.         dwExtraInfo  dd ?
  7.         mouseData    dd ?
  8. ends
  9.  
  10. ;-------------------------------------------------------------
  11. ; Обработка mousewheel
  12. ;-------------------------------------------------------------
  13. proc MousewheelProc nCode:dword,wParam:dword,lParam:dword
  14.         pusha
  15.  
  16.         cmp     [nCode],0
  17.         jl      .loc_ret
  18.  
  19.         ; Это сообщение от колеса мыши?
  20.         cmp     [wParam],WM_MOUSEWHEEL
  21.         jne     .loc_ret
  22.  
  23.         ; Заполнить структуру для идентификации иконки
  24.         mov     [notify.cbSize],sizeof.NOTIFYICONIDENTIFIER
  25.         mov     eax,[hwmain]
  26.         mov     [notify.hWnd],eax
  27.         mov     [notify.uID],ICON_ID
  28.  
  29.         ; Получить координаты иконки в трее
  30.         invoke  Shell_NotifyIconGetRect,notify,rc
  31.  
  32.         ; Указатель на MOUSEHOOKSTRUCT
  33.         mov     ebx,[lParam]
  34.  
  35.         ; Курсор находится внутри прямоугольника иконки?
  36.         invoke  PtInRect,rc,[ebx+MOUSEHOOKSTRUCTEX.pt.x],\
  37.                 [ebx+MOUSEHOOKSTRUCTEX.pt.y]
  38.         or      eax,eax
  39.         ; Нет, ничего не делать
  40.         jz      .loc_ret
  41.  
  42.         ; Проверить направление поворота колесика
  43.         mov     eax,[ebx+MOUSEHOOKSTRUCTEX.mouseData]
  44.         or      eax,eax
  45.         js      .loc_down
  46. .loc_up:
  47.         ; Вращение вверх
  48.         ...
  49.         ...
  50.         jmp     .loc_ret
  51. .loc_down:
  52.         ; Вращение вниз
  53.         ...
  54.         ...
  55.  
  56. .loc_ret:
  57.         popa
  58.         invoke  CallNextHookEx,[hhkm],[nCode],[wParam],[lParam]
  59.         ret
  60. endp
Способ замечательно работает, но есть одно большое "НО". Локальный хук будет срабатывать только в том случае, когда активно окно приложения. Если ваше приложение подразумевает именно такой принцип работы, то все нормально, больше ничего придумывать не надо.

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

01 ... 19 20 21 22 23 24 25 ... 75
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0155 сек.) / Память: 4.5 Mb
Наверх