Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: 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.

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

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Get.Window.Icon.Demo.zip (2,686 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 4949 | Комментариев: 3

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Марат (22.07.2012 в 21:23):
Спасибо Вам огромное что Вы делате, спасибо...
ManHunter (22.07.2012 в 13:48):
А почему бы не узнать про альтернативный способ через SendMessage? Больше способов - надежнее.
zummenix (22.07.2012 в 13:25):
А почему не получать иконку только через GetClassLong?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0044 сек.) / Память: 4.5 Mb
Наверх