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

Загрузка иконки напрямую из памяти
25.03.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter

Загрузка иконки напрямую из памяти
Уже который раз сталкиваюсь с тем, что для решения какой-нибудь простейшей задачи приходится сперва перекопать огромную кучу информации, а затем хитро извернуться, потому что штатных решений нет в принципе. Одна из таких задач выглядит на первый взгляд очень просто: в память загружен файл иконки, надо из него сделать хэндл HICON для дальнейшего использования.
Читать статью целиком »
Просмотров: 2888 | Комментариев: 14

Работа с иконками файлов на Ассемблере
23.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с иконками файлов на Ассемблере
Я уже рассказывал, как можно получить иконку из окна чужого приложения, сегодня тема будет похожей. Разница в том, что иконку мы будем получать из файла на диске. Применений для этого может быть много, например, чтобы отрисовать в вашем приложении красивый список файлов, нарисовать всплывающее меню, заменить иконку в собранном джойнере или патче. Для работы с иконками в WInAPI есть несколько функций, каждая со своими особенностями. В этой статье я попытаюсь подробно рассказать о них.
Читать статью целиком »
Просмотров: 2511 | Комментариев: 2

Меню с иконками на Ассемблере
07.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем кастомизацию такого элемента интерфейса, как выпадающее меню. Без меню обходится мало какое современное приложение, но вот работа с меню стандартными средствами обычно ограничивается установкой флага чекбокса, затенением неактивных пунктов или отрисовкой субменю. Попытка разнообразить меню, например, своими иконками, приводит к очень печальному результату. Ситуацию особо не спасают ни собственные битмапы, ни подгрузка изображений из списка ImageList. Очень странно, что на протяжении многих лет разработчики Windows так и не сделали инструментов "из коробки", чтобы можно было легко и комфортно работать с менюшками. К счастью, в системе есть "потайной ход", с помощью которого можно кастомизировать меню так, как вам захочется. Для своих проектов я постарался сделать как можно более универсальный инструмент для работы с меню и сейчас я с вами им поделюсь.Начнем создание собственных элементов интерфейса с того, что для каждого настраиваемого меню резервируется структура с данными следующего формата:
Code (Assembler) : Убрать нумерацию
- struct MYMENU
- hMenu dd ?
- itemWidth dd ?
- itemHeight dd ?
- hasIcons db ?
- ends
Code (Assembler) : Убрать нумерацию
- menus dd Menu1
- dd Menu2
- dd ?
- Menu1 MYMENU
- Menu2 MYMENU
Читать статью целиком »
Просмотров: 3352 | Комментариев: 4

Правильное принудительное обновление иконок в трее
21.06.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько лет назад я опубликовал в блоге статью о принудительном обновлении иконок в трее, в которой опрометчиво заявил, что это единственный способ решения задачи. Все течет, все изменяется, поэтому представляю вашему вниманию новую статью-опровержение, в которой расскажу, как правильно обновлять иконки в трее.Суть задачи остается прежней: некое приложение аварийно завершило работу, в трее остался его значок. Нужно из своего приложения обновить системный трей таким образом, чтобы этот значок убрать. Все трудности этой задачи я подробно описал в статье по ссылке выше, поэтому повторяться не буду и перейду сразу к решению. За основу взят код получения списка иконок в трее. При переборе проверяется наличие окна, которому должна принадлежать иконка. Если окна нет, значит и иконки существовать не должно. Такие иконки удаляются при помощи функции Shell_NotifyIcon с параметром NIM_DELETE.
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
- ; Структура для работы с иконкой в трее
- nid NOTIFYICONDATA
- hToolbar dd ? ; Хэндл окна с иконками
- IconsCount dd ? ; Количество иконок в трее
- ProcId dd ? ; Id процесса
- hProcess dd ? ; Хэндл процесса
- lpData dd ? ; Указатель на блок памяти
- BytesRead dd ? ; Количество прочитанных символов
Code (Assembler) : Убрать нумерацию
- ; Найти окно трея
- invoke FindWindow,class1,NULL
- or eax,eax
- jz exit_process
- ; Найти панель уведомлений
- invoke FindWindowEx,eax,NULL,class2,NULL
- or eax,eax
- jz exit_process
- ; Найти трей
- invoke FindWindowEx,eax,NULL,class3,NULL
- or eax,eax
- jz exit_process
- ; Найти панель иконок в трее
- invoke FindWindowEx,eax,NULL,class4,NULL
- or eax,eax
- jz exit_process
- ; Сохранить хэндл окна с иконками
- mov [hToolbar],eax
- ; Получить количество иконок в трее
- invoke SendMessage,eax,TB_BUTTONCOUNT,0,0
- or eax,eax
- jz exit_process
- ; Сохранить количество иконок в трее
- mov [IconsCount],eax
- ; Получить ID процесса-владельца трея
- invoke GetWindowThreadProcessId,[hToolbar],ProcId
- ; Открыть процесс с для чтения и записи
- invoke OpenProcess,PROCESS_VM_OPERATION or PROCESS_VM_READ,\
- FALSE,[ProcId]
- or eax,eax
- ; Фокус не удался
- jz exit_process
- ; Сохранить хэндл процесса-владельца трея
- mov [hProcess],eax
- ; Выделить блок памяти в контексте процесса
- invoke VirtualAllocEx,[hProcess],NULL,dword sizeof.TBBUTTON,\
- MEM_COMMIT,PAGE_READWRITE
- or eax,eax
- jz exit_process
- ; Сохранить указатель на блок памяти
- mov [lpData],eax
- ; Перебрать все иконки в трее
- loc_loop:
- ; Все иконки обработали?
- cmp [IconsCount],0
- je clear_memory
- ; Следующая иконка
- dec [IconsCount]
- ; Получить иконку из трея с индексом IconsCount
- invoke SendMessage,[hToolbar],TB_GETBUTTON,[IconsCount],[lpData]
- ; Прочитать структуру иконки
- invoke ReadProcessMemory,[hProcess],[lpData],button,\
- dword sizeof.TBBUTTON,BytesRead
- or eax,eax
- jz clear_memory
- ; Прочиталась вся структура?
- cmp [BytesRead],sizeof.TBBUTTON
- jnz clear_memory
- ; Прочитать пользовательские данные иконки
- invoke ReadProcessMemory,[hProcess],[button.dwData],extra,\
- dword sizeof.EXTRADATA,BytesRead
- or eax,eax
- jz clear_memory
- ; Прочиталась вся структура?
- cmp [BytesRead],sizeof.EXTRADATA
- jnz clear_memory
- ; Это скрытая иконка?
- mov eax,[extra.uID]
- and eax,80000000h
- or eax,eax
- ; Да, пропустить
- jnz loc_loop
- ; Окно процесса существует?
- invoke IsWindow,[extra.Wnd]
- or eax,eax
- jnz loc_loop
- ; Удалить иконку, у которой нет родителя
- mov [nid.cbSize],sizeof.NOTIFYICONDATA
- mov eax,[extra.Wnd]
- mov [nid.hWnd],eax
- mov eax,[extra.uID]
- mov [nid.uID],eax
- invoke Shell_NotifyIcon,NIM_DELETE,nid
- jmp loc_loop
- clear_memory:
- ; Очистить память и ресурсы
- invoke VirtualFreeEx,[hProcess],[lpData],0,MEM_RELEASE
- invoke CloseHandle,[hProcess]
- exit_process:
Читать статью целиком »
Просмотров: 3049 | Комментариев: 9

Как поменять стандартную иконку любой папки Windows
20.10.2013 | Категория: Software | Автор: ManHunter

Папки с измененными иконками
В Windows есть возможность поменять стандартную иконку папки на любую другую. Это бывает удобно, когда папок много и надо выделить некоторые для более быстрого визуального поиска, или если старые значки вам уже надоели. Еще некоторые приложения любят менять значки на папках, в которые они установлены. Информация о том, как поменять иконку, не является каким-то секретом, кое-кто даже налепил для этого целые многомегабайтные программы, причем некоторые из них даже платные. А вот вам и моя инструкция для новичков и продвинутых пользователей.
Читать статью целиком »
Просмотров: 17170 | Комментариев: 3
