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

В некоторых приложениях, например, в различных таскменеджерах, возникает задача получить иконку окна другого приложения, чтобы затем использовать ее в своем контексте. Делается это очень просто. Окну посылается сообщение 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.

В приложении пример программы, которая получает большую и маленькую иконки из окна под курсором и отображает их в своем окне.
Добавлено: 13 Сентября 2013 10:25:15 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...