В некоторых приложениях, например, в различных таскменеджерах, возникает задача получить иконку окна другого приложения, чтобы затем использовать ее в своем контексте. Делается это очень просто. Окну посылается сообщение
WM_GETICON с параметром
ICON_SMALL или
ICON_BIG, в зависимости от того, маленькую или большую иконку надо получить. Если это не срабатывает, то можно попробовать получить иконку при помощи функции
GetClassLong, соответственно, с параметром
GCL_HICONSM или
GCL_HICON. Если и в этом случае хэндл иконки получить не удалось, то значит не судьба. Или приложение, которому принадлежит окно, не отвечает, или же окно просто не имеет иконки. Для облегчения задачи я написал следующую функцию:
;--------------------------------------------------------------
; Функция получения иконки окна
; 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
Параметры:
hwnd - хэндл окна, из которого надо получить иконку,
dType - тип иконки, большая или маленькая. Функция самодостаточная, не требует дополнительных переменных в сегменте данных. На выходе в регистре EAX возвращается хэндл иконки или -1, в случае, если запрошенного окна не существует. Если же окно существует, но по какой-то причине не удалось получить его иконку, то вместо нее функция возвращает хэндл дефолтной иконки из библиотеки Windows.
В приложении пример программы, которая получает большую и маленькую иконки из окна под курсором и отображает их в своем окне.