Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
ВнизПолучить иконку окна. Найти похожие ветки
← →
@!!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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.042 c