Blog. Just Blog

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

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

Получение иконки из окна чужого приложения

23.07.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
В некоторых приложениях, например, в различных таскменеджерах, возникает задача получить иконку окна другого приложения, чтобы затем использовать ее в своем контексте. Делается это очень просто. Окну посылается сообщение WM_GETICON с параметром ICON_SMALL или ICON_BIG, в зависимости от того, маленькую или большую иконку надо получить. Если это не срабатывает, то можно попробовать получить иконку при помощи функции GetClassLong, соответственно, с параметром GCL_HICONSM или GCL_HICON. Если и в этом случае хэндл иконки получить не удалось, то значит не судьба. Или приложение, которому принадлежит окно, не отвечает, или же окно просто не имеет иконки. Для облегчения задачи я написал следующую функцию:
  1. ;--------------------------------------------------------------
  2. ; Функция получения иконки окна
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;--------------------------------------------------------------
  6. ; Параметры:
  7. ;     hwnd - хэндл окна
  8. ;     dType - тип иконки (0 - 16x16, 1 - 32x32)
  9. ; На выходе:
  10. ;     EAX - хэндл иконки или -1 если окна не существует
  11. ;--------------------------------------------------------------
  12. proc    GetIcon hwnd:DWORD, dType:DWORD
  13.         pusha
  14.  
  15.         ; Такое окно существует?
  16.         invoke  IsWindow,[hwnd]
  17.         or      eax,eax
  18.         jnz     @f
  19.  
  20.         ; Окно не найдено
  21.         mov     eax,-1
  22.         jmp     .loc_ret
  23. @@:
  24.         ; Какую иконку надо получить?
  25.         cmp     [dType],0
  26.         jne     .get_big_icon
  27.  
  28.         ; Получить хэндл маленькой иконки
  29. .get_small_icon:
  30.         invoke  SendMessage,[hwnd],WM_GETICON,ICON_SMALL,0
  31.         or      eax,eax
  32.         jnz     .loc_ret
  33.         invoke  GetClassLong,[hwnd],GCL_HICONSM
  34.         or      eax,eax
  35.         jnz     .loc_ret
  36.         jmp     .load_def
  37.  
  38.         ; Получить хэндл большой иконки
  39. .get_big_icon:
  40.         invoke  SendMessage,[hwnd],WM_GETICON,ICON_BIG,0
  41.         or      eax,eax
  42.         jnz     .loc_ret
  43.         invoke  GetClassLong,[hwnd],GCL_HICON
  44.         or      eax,eax
  45.         jnz     .loc_ret
  46.  
  47.         ; Получить хэндл иконки по умолчанию
  48. .load_def:
  49.         invoke  LoadIcon,NULL,IDI_WINLOGO
  50.  
  51. .loc_ret:
  52.         mov     [dType],eax
  53.         popa
  54.  
  55.         ; Вернуть результат
  56.         mov     eax,[dType]
  57.         ret
  58. endp
Параметры: hwnd - хэндл окна, из которого надо получить иконку, dType - тип иконки, большая или маленькая. Функция самодостаточная, не требует дополнительных переменных в сегменте данных. На выходе в регистре EAX возвращается хэндл иконки или -1, в случае, если запрошенного окна не существует. Если же окно существует, но по какой-то причине не удалось получить его иконку, то вместо нее функция возвращает хэндл дефолтной иконки из библиотеки Windows.

Читать статью целиком »
Просмотров: 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. То есть автоматически обновить или перерисовать его, чтобы избавиться от "мертвых" иконок, не получится. Но такие иконки удаляются, если провести курсором мышки над ними. Значит единственный способ перерисовать иконки в трее - это сэмулировать движение мыши над окном трея. Как найти окно трея и его хэндл мы уже знаем, тут ничего нового. В сегменте данных те же значения:
  1. ; Сегмент данных
  2. section '.data' data readable writeable 
  3.  
  4. class1  db 'Shell_TrayWnd',0    ; Название класса окна трея
  5. class2  db 'TrayNotifyWnd',0    ; Название класса панели уведомлений
  6. class3  db 'SysPager',0         ; Трей
  7. class4  db 'ToolbarWindow32',0  ; Панель с иконками
  8.  
  9. ToolbarHandle   dd ?            ; Хэндл окна трея
  10. ToolbarRect     RECT            ; Размер окна трея
С поиском окна тоже никаких проблем. Способ универсальный, прекрасно работает на Windows XP и Windows 7.
  1.         ; Найти окно трея
  2.         invoke  FindWindow,class1,NULL
  3.         or      eax,eax
  4.         jz      exit_process
  5.  
  6.         ; Найти панель уведомлений
  7.         invoke  FindWindowEx,eax,NULL,class2,NULL
  8.         or      eax,eax
  9.         jz      exit_process
  10.  
  11.         ; Найти трей
  12.         invoke  FindWindowEx,eax,NULL,class3,NULL
  13.         or      eax,eax
  14.         jz      exit_process
  15.  
  16.         ; Найти панель иконок в трее
  17.         invoke  FindWindowEx,eax,NULL,class4,NULL
  18.         or      eax,eax
  19.         jz      exit_process
  20.  
  21.         ; Сохранить хэндл окна с иконками
  22.         mov     [ToolbarHandle],eax
Окно трея найдено, осталось сэмулировать движение мышки. Для этого надо просто получить размеры окна трея и в цикле отправить сообщение WM_MOUSEMOVE. Не обязательно эмулировать движение мышки над каждой точкой окна, достаточно пройтись один раз над каждой иконкой. Так как размер маленькой иконки 16х16 пикселов, то шаг выберем также 16.

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

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

18.07.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда приложению требуется получить список иконок, находящихся в трее, а также список приложений, которые их туда разместили. Это может быть нужно для обнаружения некоторых скрывающихся приложений, для эмуляции кликов на иконках, ну или просто для спортивного интереса. В любом случае для получения списка иконок надо сделать следующее: найти в трее панель с иконками, при помощи сообщения TB_BUTTONCOUNT получить количество иконок, а затем через отправку сообщения TB_GETBUTTON получить всю необходимую информацию по каждой иконке. Теперь рассмотрим все шаги подробнее.

Работать с вложенными окнами трея мы уже умеем, здесь практически то же самое, разница только в названиях классов дочерних окон.
  1. ; Сегмент данных
  2. section '.data' data readable writeable 
  3. ...
  4. class1  db 'Shell_TrayWnd',0    ; Название класса окна трея
  5. class2  db 'TrayNotifyWnd',0    ; Название класса панели уведомлений
  6. class3  db 'SysPager',0         ; Трей
  7. class4  db 'ToolbarWindow32',0  ; Панель с иконками
  8.  
  9. ToolbarHandle   dd ?            ; Хэндл окна с иконками
  10. ...
  11. ; Сегмент кода
  12. section '.code' code readable executable
  13.         ...
  14.         ; Найти окно трея
  15.         invoke  FindWindow,class1,NULL
  16.         or      eax,eax
  17.         jz      exit_process
  18.  
  19.         ; Найти панель уведомлений
  20.         invoke  FindWindowEx,eax,NULL,class2,NULL
  21.         or      eax,eax
  22.         jz      exit_process
  23.  
  24.         ; Найти трей
  25.         invoke  FindWindowEx,eax,NULL,class3,NULL
  26.         or      eax,eax
  27.         jz      exit_process
  28.  
  29.         ; Найти панель иконок в трее
  30.         invoke  FindWindowEx,eax,NULL,class4,NULL
  31.         or      eax,eax
  32.         jz      exit_process
  33.  
  34.         ; Сохранить хэндл окна с иконками
  35.         mov     [ToolbarHandle],eax
  36.         ...
Теперь у нас есть хэндл окна панели инструментов с иконками в трее. Получим количество иконок в панели.
  1.         ; Получить количество иконок в трее
  2.         invoke  SendMessage,eax,TB_BUTTONCOUNT,0,0
  3.         or      eax,eax
  4.         jz      exit_process
  5.  
  6.         ; Сохранить количество иконок в трее
  7.         mov     [IconsCount],eax
Количество иконок тоже есть. Осталось перебрать их в цикле и получить всю необходимую информацию. Для этого используется сообщение TB_GETBUTTON и структура TBBUTTON для получения результата. Однако, если сейчас попробовать послать окну панели сообщение TB_GETBUTTON, то в результате не получим ничего. Почему? Потому что память, в которую будут записываться данные, обязательно должна принадлежать процессу, который является владельцем окна трея (обычно это explorer.exe).

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

Создание анимированной иконки приложения

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

Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.


Кадры для анимации

В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
  1. resource group_icons,\
  2.            1,LANG_NEUTRAL,animate1,\
  3.            2,LANG_NEUTRAL,animate2,\
  4.            3,LANG_NEUTRAL,animate3,\
  5.            4,LANG_NEUTRAL,animate4,\
  6.            5,LANG_NEUTRAL,animate5,\
  7.            6,LANG_NEUTRAL,animate6,\
  8.            7,LANG_NEUTRAL,animate7,\
  9.            8,LANG_NEUTRAL,animate8
  10.  
  11. resource icons,\
  12.            1,LANG_NEUTRAL,icon_data1,\
  13.            2,LANG_NEUTRAL,icon_data2,\
  14.            3,LANG_NEUTRAL,icon_data3,\
  15.            4,LANG_NEUTRAL,icon_data4,\
  16.            5,LANG_NEUTRAL,icon_data5,\
  17.            6,LANG_NEUTRAL,icon_data6,\
  18.            7,LANG_NEUTRAL,icon_data7,\
  19.            8,LANG_NEUTRAL,icon_data8
  20.  
  21. icon animate1,icon_data1,'icon1.ico'
  22. icon animate2,icon_data2,'icon2.ico'
  23. icon animate3,icon_data3,'icon3.ico'
  24. icon animate4,icon_data4,'icon4.ico'
  25. icon animate5,icon_data5,'icon5.ico'
  26. icon animate6,icon_data6,'icon6.ico'
  27. icon animate7,icon_data7,'icon7.ico'
  28. icon animate8,icon_data8,'icon8.ico'
Теперь рассмотрим оба варианта анимированных иконок.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0056 сек.) / Память: 4.5 Mb
Наверх