Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить иконку окна.


@!!ex ©   (2008-01-31 13:36:00) 

Есть окно, нужнео получить его иконку и засунуть в TBitMap. Как??


DVM   (2008-01-31 23:40:00) [1]


> @!!ex ©   (31.01.08 23:37) [9]

Присмотрись у WordPad полученная иконка не кривая?

А дисетчер задач свою иконку твоему коду не отдаст. Там ICON_SMALL2 константа нужна если мне помнится.


> Думаю сделать еще одну проверку, если иконка не загрузилась,
>  искать главное окно приложения и брать иконку уже у него.
>

У некоторых программ еще поискать надо. что есть главное окно.


@!!ex   (2008-01-31 23:38:00) [2]

http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1201810312
на Ctrl+Alt+Tab(по умолчанию) выводятся иконки.


@!!ex   (2008-01-31 23:37:00) [3]

> [8] DVM ©   (31.01.08 23:34)

На диспетчере задач не могу проверить, у мну он заменен на AnVir...
А wordpad норально отрабатывает.
Пока увидел косяк только у окошек сообщений в gtalke, Думаю сделать еще одну проверку, если иконка не загрузилась, искать главное окно приложения и брать иконку уже у него.


DVM   (2008-01-31 23:34:00) [4]


> @!!ex ©   (31.01.08 23:30) [7]

Проверь свой код на диспетчере задач и на WordPad


@!!ex   (2008-01-31 23:30:00) [5]

Да я уж сделал давно:
Function GetWindowIcon(hWnd:HWND):HICON;
begin
 Result:=0;
 SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG or SMTO_BLOCK, 1000, Cardinal(Result));

 if Result=0 then
   Result := GetClassLong(hWnd, GCL_HICON);

 if Result=0 then
   Result := GetClassLong(hWnd, GCL_HICONSM);

 if Result=0 then
   Result := LoadIcon(0, IDI_APPLICATION);
end;


DVM   (2008-01-31 22:52:00) [6]

Вот моя версия:

function _GetFileAssociatedIcon(FileName: string; bSmall: boolean): HICON;
var
 FileInfo: SHFILEINFO;
 BIG_OR_SMALL_ICON: integer;
begin
 if bSmall then
   BIG_OR_SMALL_ICON := SHGFI_SMALLICON
 else
   BIG_OR_SMALL_ICON := SHGFI_LARGEICON;
 SHGetFileInfo(PChar(FileName),
               FILE_ATTRIBUTE_NORMAL,
               FileInfo,
               SizeOf(FileInfo),
               SHGFI_ICON or BIG_OR_SMALL_ICON or SHGFI_SYSICONINDEX);
 Result := FileInfo.hIcon;
end;

//------------------------------------------------------------------------------

function _GetProcessFileNameByWindowHandle(Wnd: HWND): string;
var
 hProcess: THandle;
 PID: Cardinal;
 FileName: array [1..MAX_PATH] of char;
 PE: TProcessEntry32;
 Snap: Cardinal;
 OsVerInfo: TOSVersionInfo;
begin
 Result := '';
 GetWindowThreadProcessId(Wnd, @PID);
 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 if GetVersionEx(osVerInfo) then
   begin
     if OsVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
       begin
         ZeroMemory(@Filename[1], SizeOf(Filename));
         GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));
         Result := FileName;
       end
     else
       begin
         Snap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
         if Snap <> -1 then
           begin
             PE.dwSize:=SizeOf(PE);
             if Process32First(Snap, PE) then
               repeat
                 if PE.th32ProcessID = PID then Result := PE.szExeFile;
               until not Process32Next(Snap, PE);
           end;
       end;
   end;
 CloseHandle(hProcess);
end;

//------------------------------------------------------------------------------

function GetIconFromWindow(hWnd: HWND): HICON; stdcall;
const
 ICON_SMALL2 = 2;
begin
 Result := 0;
 // Get Small Icon From Window ...
 SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then Result := GetClassLong(hWnd, GCL_HICONSM);
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL, 1,
                        SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL2, 1,
                        SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_SMALL,
                        0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_SMALL2,
                       0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 // Get Big Icon From Window ...
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then Result := GetClassLong(hWnd, GCL_HICON);
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 1,
                      SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_BIG,
                      0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 // Get Icon From File ...
 if Result = 0 then Result := _GetFileAssociatedIcon(_GetProcessFileNameByWindowHandle(hWnd), true);
 if Result = 0 then Result := _GetFileAssociatedIcon(_GetProcessFileNameByWindowHandle(hWnd), false);
 // Load Default Icon ...  }
 if Result = 0 then Result := LoadIcon(0, IDI_APPLICATION);
end; // End of function GetIconFromWindow


Игорь Шевченко   (2008-01-31 22:50:00) [7]

Примерно так:

function GetIcon (Wnd: HWND): THandle;
begin
 Result := GetClassLong(Wnd, GCL_HICONSM);
 if Result = 0 then
   if SendMessageTimeOut(Wnd, WM_GETICON, ICON_SMALL, 0,
        SMTO_NORMAL, 100, Result) = 0 then
     Result := 0;
 if Result = 0 then
   Result := LoadIcon(0, IDI_APPLICATION);
end;


DVM   (2008-01-31 22:45:00) [8]


> @!!ex ©

Я ж тебе высылал исходники шелла, там есть функция, вытаскивающая иконку у 99.99% окон, где она вообще есть. [1] - это процентов 60.


DVM   (2008-01-31 22:42:00) [9]


> Да. То что нужно! Спасибо!

не получится так.


@!!ex   (2008-01-31 13:43:00) [10]

> [1] ketmar ©   (31.01.08 13:37)

Да. То что нужно! Спасибо!


ketmar   (2008-01-31 13:37:00) [11]

WM_GETICON?


Наверх

Титульная страница Поиск, карта сайта Написать письмо