Здравствуйте, Vis, Вы писали:

Vis>Можно ли имея HWND извлечь иконку окна, причем:


Vis>1) HWND принадлежит другому процессу.

Vis>2) Окно имеет captionbar c иконкой, видимой визуально.


Vis>Почему то WM_GETICON не работает.

Vis>Может у него какие-то ограничения на окна из другого процесса?

Ограничений нет, но WM_GETICON вернет иконку только если иконка этого типа была до этого установлена через WM_SETICON. В то же время, приложение может не вызывать WM_SETICON, а зарегистрировать иконку в классе окна.

Я когда-то написал вот такой код для получения иконки окна другого процесса:

HICON GetWindowIcon(
    __in HWND hWnd
    )
{
    _ASSERTE(IsWindow(hWnd));

    HICON hIcon = NULL;

    if (SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL, 0, 
                           SMTO_ABORTIFHUNG|SMTO_BLOCK, 1000, 
                           (DWORD_PTR *)&hIcon))
    {
        if (hIcon == NULL)
        {
            if (!SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0, 
                                    SMTO_ABORTIFHUNG|SMTO_BLOCK, 1000, 
                                    (DWORD_PTR *)&hIcon))
                hIcon = NULL;
        }
    }
    else
        hIcon = NULL;

    if (hIcon == NULL)
        hIcon = (HICON)GetClassLongPtr(hWnd, GCLP_HICONSM);

    if (hIcon == NULL)
        hIcon = (HICON)GetClassLongPtr(hWnd, GCLP_HICON);

    if (hIcon == NULL)
        hIcon = LoadIcon(NULL, IDI_APPLICATION);

    return hIcon;
}
Автор: Alex Fedotov    Оценить