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

Обработка колесика мыши над иконкой в трее
12.11.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
"По следам наших публикаций", как любили писать в советской прессе. В предыдущей статье я обещал рассказать, каким образом можно реализовать обработку вращения колесика мыши над иконкой в системном трее. Поскольку система не отправляет иконкам в трее сообщение WM_MOUSEWHEEL, обрабатывать его мы будем при помощи хуков и описанных в предыдущей статье методов определения, что курсор находится над нужной иконкой. Начнем с локального хука. Установка и снятие хука выполняется самым обычным способом, например:Code (Assembler) : Убрать нумерацию
- proc DialogProc hwnddlg,msg,wparam,lparam
- push ebx esi edi
- cmp [msg],WM_INITDIALOG
- je .wminitdialog
- cmp [msg],WM_CLOSE
- je .wmclose
- ...
- ...
- xor eax,eax
- jmp .finish
- .wminitdialog:
- ...
- ...
- ; Показать иконку в трее
- invoke Shell_NotifyIcon, NIM_ADD,node
- ; Установить обработчик мыши
- invoke GetCurrentThreadId
- invoke SetWindowsHookEx,WH_MOUSE,MousewheelProc,NULL,eax
- mov [hhkm],eax
- mov eax,[hwnddlg]
- mov [hwmain],eax
- jmp .processed
- ...
- ...
- .wmclose:
- ; Снять обработчик мыши
- invoke UnhookWindowsHookEx,[hhkm]
- ; Удалить иконку из трея
- invoke Shell_NotifyIcon,NIM_DELETE,node
- ; Закрыть окно
- invoke EndDialog,[hwnddlg],0
- .processed:
- mov eax,1
- .finish:
- pop edi esi ebx
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Структура для обработчика хука
- struct MOUSEHOOKSTRUCTEX
- pt POINT
- hwnd dd ?
- wHitTestCode dd ?
- dwExtraInfo dd ?
- mouseData dd ?
- ends
- ;-------------------------------------------------------------
- ; Обработка mousewheel
- ;-------------------------------------------------------------
- proc MousewheelProc nCode:dword,wParam:dword,lParam:dword
- pusha
- cmp [nCode],0
- jl .loc_ret
- ; Это сообщение от колеса мыши?
- cmp [wParam],WM_MOUSEWHEEL
- jne .loc_ret
- ; Заполнить структуру для идентификации иконки
- mov [notify.cbSize],sizeof.NOTIFYICONIDENTIFIER
- mov eax,[hwmain]
- mov [notify.hWnd],eax
- mov [notify.uID],ICON_ID
- ; Получить координаты иконки в трее
- invoke Shell_NotifyIconGetRect,notify,rc
- ; Указатель на MOUSEHOOKSTRUCT
- mov ebx,[lParam]
- ; Курсор находится внутри прямоугольника иконки?
- invoke PtInRect,rc,[ebx+MOUSEHOOKSTRUCTEX.pt.x],\
- [ebx+MOUSEHOOKSTRUCTEX.pt.y]
- or eax,eax
- ; Нет, ничего не делать
- jz .loc_ret
- ; Проверить направление поворота колесика
- mov eax,[ebx+MOUSEHOOKSTRUCTEX.mouseData]
- or eax,eax
- js .loc_down
- .loc_up:
- ; Вращение вверх
- ...
- ...
- jmp .loc_ret
- .loc_down:
- ; Вращение вниз
- ...
- ...
- .loc_ret:
- popa
- invoke CallNextHookEx,[hhkm],[nCode],[wParam],[lParam]
- ret
- endp
Читать статью целиком »
Просмотров: 602 | Комментариев: 8

Получение координат иконки в трее
06.11.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодняшний пример - получение координат иконки в трее. Для чего это надо, я поясню чуть ниже. Сам код основан на уже знакомом вам переборе иконок в трее, поэтому практически все структуры будут такими же. Теоретическая часть работы с треем расписана там же, дублировать ее не буду. Начнем с описания всех необходимых структур и данных:Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; Структура пользовательских данных иконки
- struct EXTRADATA
- Wnd dd ?
- uID dd ?
- ends
- class1 db 'Shell_TrayWnd',0 ; Название класса окна трея
- class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений
- class3 db 'SysPager',0 ; Трей
- class4 db 'ToolbarWindow32',0 ; Панель с иконками
- ; Структура для кнопки
- button TBBUTTON
- ; Структура для пользовательских данных иконки
- extra EXTRADATA
- ; Иконка в трее
- node NOTIFYICONDATA
- ; Координаты иконки в трее
- rc RECT
- ICON_ID = 777
- hInstance dd ? ; Хэндл приложения
- hToolbar dd ? ; Хэндл окна с иконками
- IconsCount dd ? ; Количество иконок в трее
- ProcId dd ? ; Id процесса
- hProcess dd ? ; Хэндл процесса
- lpData dd ? ; Указатель на блок памяти
- BytesRead dd ? ; Количество прочитанных символов
Читать статью целиком »
Просмотров: 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, то, соответственно, удаляется.Code (Assembler) : Убрать нумерацию
- BCM_SETSHIELD = 0x160C
- ; Установить иконку на кнопку
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN1,BCM_SETSHIELD,0,TRUE
Code (Assembler) : Убрать нумерацию
- ; Какая-то иконка на кнопке уже есть?
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN1,BM_GETIMAGE,IMAGE_ICON,0
- or eax,eax
- jnz @f
- ; Иконки нет
- ...
- @@:
- ; Иконка есть
- ...
Code (Assembler) : Убрать нумерацию
- IDI_SHIELD = 0x7F06
- ; Загрузить иконку щита
- invoke GetSystemMetrics,SM_CXSMICON
- invoke LoadIconWithScaleDown,0,IDI_SHIELD,eax,eax,hShieldIcon
- ; [hShieldIcon] --> хэндл иконки щита
- ; Установить иконку на кнопку
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN2,BM_SETIMAGE,\
- IMAGE_ICON,[hShieldIcon]
- ; Установить иконку в заголовок окна
- invoke SendMessage,[hwnddlg],WM_SETICON,ICON_SMALL,[hShieldIcon]
- ; Установить иконку на STATIC
- invoke SendDlgItemMessage,[hwnddlg],ID_STAT,STM_SETIMAGE,\
- IMAGE_ICON,[hShieldIcon]
Читать статью целиком »
Просмотров: 951 | Комментариев: 1
