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

Получение иконки из окна чужого приложения
23.07.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
В некоторых приложениях, например, в различных таскменеджерах, возникает задача получить иконку окна другого приложения, чтобы затем использовать ее в своем контексте. Делается это очень просто. Окну посылается сообщение WM_GETICON с параметром ICON_SMALL или ICON_BIG, в зависимости от того, маленькую или большую иконку надо получить. Если это не срабатывает, то можно попробовать получить иконку при помощи функции GetClassLong, соответственно, с параметром GCL_HICONSM или GCL_HICON. Если и в этом случае хэндл иконки получить не удалось, то значит не судьба. Или приложение, которому принадлежит окно, не отвечает, или же окно просто не имеет иконки. Для облегчения задачи я написал следующую функцию:Code (Assembler) : Убрать нумерацию
- ;--------------------------------------------------------------
- ; Функция получения иконки окна
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;--------------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл окна
- ; dType - тип иконки (0 - 16x16, 1 - 32x32)
- ; На выходе:
- ; EAX - хэндл иконки или -1 если окна не существует
- ;--------------------------------------------------------------
- proc GetIcon hwnd:DWORD, dType:DWORD
- pusha
- ; Такое окно существует?
- invoke IsWindow,[hwnd]
- or eax,eax
- jnz @f
- ; Окно не найдено
- mov eax,-1
- jmp .loc_ret
- @@:
- ; Какую иконку надо получить?
- cmp [dType],0
- jne .get_big_icon
- ; Получить хэндл маленькой иконки
- .get_small_icon:
- invoke SendMessage,[hwnd],WM_GETICON,ICON_SMALL,0
- or eax,eax
- jnz .loc_ret
- invoke GetClassLong,[hwnd],GCL_HICONSM
- or eax,eax
- jnz .loc_ret
- jmp .load_def
- ; Получить хэндл большой иконки
- .get_big_icon:
- invoke SendMessage,[hwnd],WM_GETICON,ICON_BIG,0
- or eax,eax
- jnz .loc_ret
- invoke GetClassLong,[hwnd],GCL_HICON
- or eax,eax
- jnz .loc_ret
- ; Получить хэндл иконки по умолчанию
- .load_def:
- invoke LoadIcon,NULL,IDI_WINLOGO
- .loc_ret:
- mov [dType],eax
- popa
- ; Вернуть результат
- mov eax,[dType]
- ret
- endp
Читать статью целиком »
Просмотров: 4990 | Комментариев: 3

Замена главной иконки браузера Firefox
15.07.2012 | Категория: Software | Автор: ManHunter

Замена главной иконки браузера Firefox
Сегодня я познакомлю вас с еще одной настройкой браузера Firefox. Оказывается, можно поменять его иконку на любую другую, при этом даже не придется ковыряться во внутренностях исполняемого файла редакторами ресурсов. Зайдите через Проводник или любой файловый менеджер в папку с установленным браузером и проверьте наличие в ней подпапки "\chrome\icons\default". Туда складывают иконки различные расширения браузера, поэтому не исключено, что такая папка на диске уже есть. Если нет, то создайте ее. Папка "chrome" обязательно должна быть, поэтому сперва в ней создайте папку "icons", а затем уже в ней папку "default". В итоге должно получиться что-то наподобие такого пути:
C:\Program Files\Mozilla Firefox\chrome\icons\default\
Теперь идем на сайт с бесплатными иконками, выбираем нужную и сохраняем ее с расширением ico. Дальше переименовываем файл иконки в main-window.ico и переносим его в созданную папку "default". Все, осталось быстренько перезапустить браузер и, если все сделано правильно, наслаждаться результатами. Поддерживаются не только обычные, но и мультииконки (когда в одном файле содержатся иконки разных размеров). После замены иконки браузер можно переустанавливать, обновлять, делать с ним что угодно, новая иконка будет подгружаться до тех пор, пока файл main-window.ico будет находиться на месте.
Читать статью целиком »
Просмотров: 17175 | Комментариев: 17

Принудительное обновление иконок в трее
12.01.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
В случае аварийного завершения или некорректной работы некоторых приложений, в системном трее могут оставаться "мертвые" иконки, которые уже не принадлежат ни одному запущенному процессу. Глюк хоть и не смертельный, но все равно неприятный. И основная проблема в том, что область трея никак не реагирует на внешние сообщения типа WM_REPAINT, и функции типа UpdateWindow и InvalidateRect. То есть автоматически обновить или перерисовать его, чтобы избавиться от "мертвых" иконок, не получится. Но такие иконки удаляются, если провести курсором мышки над ними. Значит единственный способ перерисовать иконки в трее - это сэмулировать движение мыши над окном трея. Как найти окно трея и его хэндл мы уже знаем, тут ничего нового. В сегменте данных те же значения:Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- class1 db 'Shell_TrayWnd',0 ; Название класса окна трея
- class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений
- class3 db 'SysPager',0 ; Трей
- class4 db 'ToolbarWindow32',0 ; Панель с иконками
- ToolbarHandle dd ? ; Хэндл окна трея
- ToolbarRect RECT ; Размер окна трея
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 [ToolbarHandle],eax
Читать статью целиком »
Просмотров: 9008 | Комментариев: 21

Получение списка иконок в трее
18.07.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда приложению требуется получить список иконок, находящихся в трее, а также список приложений, которые их туда разместили. Это может быть нужно для обнаружения некоторых скрывающихся приложений, для эмуляции кликов на иконках, ну или просто для спортивного интереса. В любом случае для получения списка иконок надо сделать следующее: найти в трее панель с иконками, при помощи сообщения TB_BUTTONCOUNT получить количество иконок, а затем через отправку сообщения TB_GETBUTTON получить всю необходимую информацию по каждой иконке. Теперь рассмотрим все шаги подробнее.Работать с вложенными окнами трея мы уже умеем, здесь практически то же самое, разница только в названиях классов дочерних окон.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- class1 db 'Shell_TrayWnd',0 ; Название класса окна трея
- class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений
- class3 db 'SysPager',0 ; Трей
- class4 db 'ToolbarWindow32',0 ; Панель с иконками
- ToolbarHandle dd ? ; Хэндл окна с иконками
- ...
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Найти окно трея
- 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 [ToolbarHandle],eax
- ...
Code (Assembler) : Убрать нумерацию
- ; Получить количество иконок в трее
- invoke SendMessage,eax,TB_BUTTONCOUNT,0,0
- or eax,eax
- jz exit_process
- ; Сохранить количество иконок в трее
- mov [IconsCount],eax
Читать статью целиком »
Просмотров: 9147 | Комментариев: 9

Создание анимированной иконки приложения
24.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа TheBat! таким способом оповещает, что пришло новое письмо, качалка Download Master показывает свою активность при загрузке файлов, антивирусы обозначают процесс сканирования файлов, ICQ крутит "цветочек" при подключении, ну и так далее. Реальных примеров на самом деле много.Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.

Кадры для анимации
В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
Code (Assembler) : Убрать нумерацию
- resource group_icons,\
- 1,LANG_NEUTRAL,animate1,\
- 2,LANG_NEUTRAL,animate2,\
- 3,LANG_NEUTRAL,animate3,\
- 4,LANG_NEUTRAL,animate4,\
- 5,LANG_NEUTRAL,animate5,\
- 6,LANG_NEUTRAL,animate6,\
- 7,LANG_NEUTRAL,animate7,\
- 8,LANG_NEUTRAL,animate8
- resource icons,\
- 1,LANG_NEUTRAL,icon_data1,\
- 2,LANG_NEUTRAL,icon_data2,\
- 3,LANG_NEUTRAL,icon_data3,\
- 4,LANG_NEUTRAL,icon_data4,\
- 5,LANG_NEUTRAL,icon_data5,\
- 6,LANG_NEUTRAL,icon_data6,\
- 7,LANG_NEUTRAL,icon_data7,\
- 8,LANG_NEUTRAL,icon_data8
- icon animate1,icon_data1,'icon1.ico'
- icon animate2,icon_data2,'icon2.ico'
- icon animate3,icon_data3,'icon3.ico'
- icon animate4,icon_data4,'icon4.ico'
- icon animate5,icon_data5,'icon5.ico'
- icon animate6,icon_data6,'icon6.ico'
- icon animate7,icon_data7,'icon7.ico'
- icon animate8,icon_data8,'icon8.ico'
Читать статью целиком »
Просмотров: 10547 | Комментариев: 14
