Blog. Just Blog

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

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

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

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
Способ замечательно работает, но есть одно большое "НО". Локальный хук будет срабатывать только в том случае, когда активно окно приложения. Если ваше приложение подразумевает именно такой принцип работы, то все нормально, больше ничего придумывать не надо.

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

Получение координат иконки в трее

06.11.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодняшний пример - получение координат иконки в трее. Для чего это надо, я поясню чуть ниже. Сам код основан на уже знакомом вам переборе иконок в трее, поэтому практически все структуры будут такими же. Теоретическая часть работы с треем расписана там же, дублировать ее не буду. Начнем с описания всех необходимых структур и данных:
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; Структура пользовательских данных иконки
  5. struct EXTRADATA
  6.         Wnd dd ?
  7.         uID dd ?
  8. ends
  9.  
  10. class1     db 'Shell_TrayWnd',0    ; Название класса окна трея
  11. class2     db 'TrayNotifyWnd',0    ; Название класса панели уведомлений
  12. class3     db 'SysPager',0         ; Трей
  13. class4     db 'ToolbarWindow32',0  ; Панель с иконками
  14.  
  15. ; Структура для кнопки
  16. button     TBBUTTON
  17. ; Структура для пользовательских данных иконки
  18. extra      EXTRADATA
  19. ; Иконка в трее
  20. node       NOTIFYICONDATA
  21. ; Координаты иконки в трее
  22. rc         RECT
  23.  
  24. ICON_ID = 777
  25.  
  26. hInstance  dd ?    ; Хэндл приложения
  27. hToolbar   dd ?    ; Хэндл окна с иконками
  28. IconsCount dd ?    ; Количество иконок в трее
  29. ProcId     dd ?    ; Id процесса
  30. hProcess   dd ?    ; Хэндл процесса
  31. lpData     dd ?    ; Указатель на блок памяти
  32. BytesRead  dd ?    ; Количество прочитанных символов
Но теории все равно не избежать. В отличие от упомянутого кода, мы будем проверять, чтобы очередная иконка в трее принадлежала нашему процессу и при этом ее идентификатор совпадал с нужным. Если все условия выполнены, то отправляем окну трея сообщение TB_GETITEMRECT и получаем указатель на структуру, в которой содержатся координаты иконки относительно окна трея. С помощью ReadProcessMemory читаем эти данные и преобразуем в абсолютные экранные координаты функцией MapWindowPoints.

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

Работа с контролом SysTabControl32 на Ассемблере

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

Работа с контролом SysTabControl32 на Ассемблере

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

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

Исследование защиты программы Axialis IconWorkshop

18.10.2020 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы Axialis IconWorkshop

Axialis IconWorkshop - мощный графический редактор от известной компании-производителя коммерческих иконок. Предназначен для создания иконок и их редактирования. Множество эффектов, настроек, многооконный режим работы, поддержка библиотек иконок и другие возможности делают этот редактор настоящим профессиональным инструментом для дизайнеров. Всю радость портит только шароварность программы, то есть необходимость выкладывать за нее деньги.

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

Как добавить иконку щита UAC на кнопку

26.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Начиная с Windows Vista, в интерфейсе системы на некоторых элементах управления появился значок в виде щита. Он означает, что при взаимодействии с таким элементом у пользователя будут запрошены повышенные права доступа. Если ваша программа выполняет действия, которые требуют повышенных прав, то хорошим тоном будет тоже отмечать специальной иконкой элементы управления, запускающие такие функции. Но совсем не обязательно таскать иконку в ресурсах или в каких-то отдельных файлах, тем более, что на разных системах она выглядит по-разному. Все делается очень просто, достаточно отправить нужной кнопке сообщение BCM_SETSHIELD и система сама дополнит кнопку иконкой щита, принятой в данной версии Windows. Если lParam сообщения равен TRUE, то иконка щита добавляется, а если FALSE, то, соответственно, удаляется.
  1.         BCM_SETSHIELD = 0x160C
  2.  
  3.         ; Установить иконку на кнопку
  4.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN1,BCM_SETSHIELD,0,TRUE
Узнать наличие иконки щита на кнопке можно при помощи сообщения BM_GETIMAGE. Точнее, так можно определить наличие иконки вообще, а не конкретно щита. Если сообщение вернуло 0, то никакая иконка на кнопке не отображается.
  1.         ; Какая-то иконка на кнопке уже есть?
  2.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN1,BM_GETIMAGE,IMAGE_ICON,0
  3.         or      eax,eax
  4.         jnz     @f
  5.         ; Иконки нет
  6.         ...
  7. @@:
  8.         ; Иконка есть
  9.         ...
В официальной документации сказано, что единственными элементами управления, на которые таким образом можно навесить значок щита, являются кнопки и командные ссылки. Но никто не запрещает загрузить изображение щита как обычную иконку и затем использовать ее хэндл. Иконка загружается с небольшим подвыподвертом - через функцию LoadIconWithScaleDown. Загруженную иконку можно установить в заголовок окна, на STATIC, в заголовок вкладки, точно так же на кнопку или на любой другой элемент диалогового окна, который поддерживает отображение HICON.
  1.         IDI_SHIELD    = 0x7F06
  2.  
  3.         ; Загрузить иконку щита
  4.         invoke  GetSystemMetrics,SM_CXSMICON
  5.         invoke  LoadIconWithScaleDown,0,IDI_SHIELD,eax,eax,hShieldIcon
  6.         ; [hShieldIcon] --> хэндл иконки щита
  7.  
  8.         ; Установить иконку на кнопку
  9.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN2,BM_SETIMAGE,\
  10.                 IMAGE_ICON,[hShieldIcon]
  11.         ; Установить иконку в заголовок окна
  12.         invoke  SendMessage,[hwnddlg],WM_SETICON,ICON_SMALL,[hShieldIcon]
  13.         ; Установить иконку на STATIC
  14.         invoke  SendDlgItemMessage,[hwnddlg],ID_STAT,STM_SETIMAGE,\
  15.                 IMAGE_ICON,[hShieldIcon]
Важное замечание. Чтобы программа могла использовать сообщение BCM_SETSHIELD и функцию LoadIconWithScaleDown, она должна быть скомпилирована с манифестом, в котором заявлена поддержка динамической библиотеки comctl32.dll версии 6.

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

prev 01 02 03 04
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2023
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.14 сек. / MySQL: 3 (0.0616 сек.) / Память: 5 Mb
Наверх