Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Получить иконку окна.   Найти похожие ветки 

 
@!!ex ©   (2008-01-31 13:36) [0]

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


 
ketmar ©   (2008-01-31 13:37) [1]

WM_GETICON?


 
@!!ex ©   (2008-01-31 13:43) [2]

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

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


 
DVM ©   (2008-01-31 22:42) [3]


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

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


 
DVM ©   (2008-01-31 22:45) [4]


> @!!ex ©

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


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

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

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:52) [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


 
@!!ex ©   (2008-01-31 23:30) [7]

Да я уж сделал давно:
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 23:34) [8]


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

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


 
@!!ex ©   (2008-01-31 23:37) [9]

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

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


 
@!!ex ©   (2008-01-31 23:38) [10]

http://delphimaster.net/view/15-1201810312/
на Ctrl+Alt+Tab(по умолчанию) выводятся иконки.


 
DVM ©   (2008-01-31 23:40) [11]


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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1201687303
Я
2008-01-30 13:01
2008.02.24
Как получить интервалы дат в неделях года


8-1174828087
KOSik
2007-03-25 17:08
2008.02.24
Скругление угла


2-1201801123
Res
2008-01-31 20:38
2008.02.24
WinApi


2-1201780574
mikola
2008-01-31 14:56
2008.02.24
коментарий к картинке


2-1201596073
Edit
2008-01-29 11:41
2008.02.24
Edit с заглавной буквы