Форум: "Система";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизIcon Найти похожие ветки
← →
наблюдатель (2003-12-22 09:18) [0]Здравствуйте уважаемые участники! У меня возникла такая вот проблема. Есть такая вот функция, которая получает иконку с какого-нибудь окна, и всё бы ничего, если бы не программы, у которых в окне (т.е. в левом верхнем углу окна) нет Icon-ки, а в таскбаре она есть, мне встретились уже две такие программы - ShoWin и Prkiller. Вот текст функции:
function geticn (hnd:hwnd):hicon;
var m1,m2,m3,m4:integer;
bufhcn:hicon;
begin
m1:=icon_small;
m2:=2; //icon_small2;
m3:=gcl_hiconsm;
m4:=gcl_hicon;
bufhcn:=0;
if bufhcn=0 then bufhcn:=sendmessage (hnd,wm_geticon,m1,0);
if bufhcn=0 then bufhcn:=sendmessage (hnd,wm_geticon,m2,0);
if bufhcn=0 then bufhcn:=getclasslong (hnd,m3);
if bufhcn=0 then bufhcn:=getclasslong (hnd,m4);
result:=bufhcn;
end;
P.S. Кстати, у Oper-ы тоже значёк вытащить не получалось, пока я не применил ICON_SMALL2, хотя это может быть из-за моей WinXP, потому как в MSDN сказано, что она (ICON_SMALL2) работает только начиная с WinXP.
Вообщем чего делать я не знаю! Помогите кто чем может!
← →
DVM © (2003-12-22 20:37) [1]{******************************************************************************}
function GetIconFromWindow(hWnd:HWND; bBigIcon:boolean):HICON;
var
BigOrSmall,BigOrSmall2:integer;
hIcon:THandle;
begin
hIcon:=0;
if bBigIcon then
begin
BigOrSmall:=ICON_BIG;
BigOrSmall2:=GCL_HICON;
end
else
begin
BigOrSmall:=ICON_SMALL;
BigOrSmall2:=GCL_HICONSM;
end;
SendMessageTimeout(hWnd, WM_GETICON, BigOrSmall, 0, SMTO_ABORTIFHUNG, 1000, HIcon);
if hIcon=0 then hIcon := GetClassLong(hWnd, BigOrSmall2);
if hIcon=0 then SendMessageTimeout(hWnd, WM_GETICON, BigOrSmall, 1,
SMTO_ABORTIFHUNG, 1000, hIcon);
if hIcon=0 then hIcon := GetClassLong(hWnd, BigOrSmall2);
if hIcon=0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, BigOrSmall,
0, SMTO_ABORTIFHUNG, 1000, hIcon);
result:=hIcon;
end; // End of function GetIconFromWindow --------------------------------------
← →
YuRock © (2003-12-22 20:50) [2]Вот вариант получения всех иконок из exe-файла (dll) (если знаешь его имя). Может, будет полезно:
procedure SaveIconToFile(hI: HICON; cName: String);
var
Icon: TIcon;
begin
try
Icon := TIcon.Create;
Icon.Handle := hI;
Icon.SaveToFile(cName);
Icon.Free;
except
end;
end;
procedure ExtractIconFromFile(cFile: String);
var
hI: HICON;
i: Integer;
begin
i := 0;
hI := ExtractIcon(hInstance, LPSTR(cFile), 0);
while hI > 1 do begin
SaveIconToFile(hI, LPSTR(cFile + IntToStr(i) + ".ico"));
hI := ExtractIcon(hInstance, LPSTR(cFile), i);
i := i + 1;
end;
end;
← →
наблюдатель (2003-12-23 15:54) [3]> DVM
Спасибо конечно, но и она не помогает. Я вот думаю, может надо ей другой HANDLE передать, потому как во время исследования окон Oper-ы, я нашёл окно (не помню класс), с которого вашей процедурой можно вытащить иконку, а если ей передать HANDLE от HSHELL_WINDOWCREATED, то никакой иконки там нет. Но если использовать ICON_SMALL2, то с этим HANDLE-ом иконка возвращается. Хотя на других Windows я этого не проверял.
> YuRock
И вам тоже спасибо, но мне надо получить иконку не из *.EXE или *.DLL файла, а с окна. Но всё равно спасибо за участие в решении этой проблемы.
← →
DVM © (2003-12-23 17:59) [4]
> наблюдатель (23.12.03 15:54) [3]
собственно иконку оперы я могу достать без проблем немного подправленной этой функцией. Вы это уже видели. Эта функция немного стара для WinXP
> Но если использовать ICON_SMALL2, то с этим HANDLE-ом иконка
> возвращается
Ну так и дерзайте. Так и надо делать. В MSDN же описано все.
Пытайтесь достать иконку всеми мыслимыми способами - сначала маленькую, затем если не получилось - большую, и, наконец, если никаких других иконок не вытащено, достать иконку из файла.
> а если ей передать HANDLE от HSHELL_WINDOWCREATED
Вообще то этого не достатьчно. Иконка окна в момент создания может и отсутствовать, а потом может быть ему назначена. Поэтому еще надо отслеживать HSHELL_REDRAW
← →
имя (2003-12-27 14:14) [5]Удалено модератором
Примечание: Не надо использовать разные ники в одной ветке
← →
DVM © (2003-12-28 16:25) [6]Да еще забыл сказать. Надо проверять - действительно ли окно топ-левел, или, другими словами, должно ли оно появляться на таскбаре.
← →
имя (2003-12-30 10:41) [7]Удалено модератором
Примечание: Не надо использовать разные ники в одной ветке
← →
имя (2003-12-31 09:38) [8]Удалено модератором
Примечание: Не надо использовать разные ники в одной ветке
← →
_наблюдатель_ (2004-01-04 10:15) [9]Да не использовал я разные ники. Просто под моим старым кто-то зарегестрировался, и пришлось изменить мой. Вот и все. Я хотел зарегестрироваться, раньше но вот руки не доходили.
По теме->
> DVM
У этих программ окно только одно, и на таскбаре оно появдяется у вас, у Explorer-а, у меня. Но иконки нет только у меня. Я даже через GetClassInfo и GetClassInfoEx пытался её достать, но и там в HANDLE-ах (в смысле HICON-ах) нули.
← →
DVM © (2004-01-05 12:33) [10]function GetFileAssociatedIcon(FileName: string; bSmall: boolean): HICON;
var
FileInfo: SHFILEINFO;
hImgList: HIMAGELIST;
BIG_OR_SMALL_ICON: integer;
begin
if bSmall then
BIG_OR_SMALL_ICON := SHGFI_SMALLICON
else
BIG_OR_SMALL_ICON := SHGFI_LARGEICON;
hImgList := SHGetFileInfo(PChar(FileName),
FILE_ATTRIBUTE_NORMAL,
FileInfo,
SizeOf(FileInfo),
SHGFI_ICON or BIG_OR_SMALL_ICON or SHGFI_SYSICONINDEX);
Result := FileInfo.hIcon;
end;
//------------------------------------------------------------------------------
function GetIconFromWindow(hWnd: HWND): HICON;
const
ICON_SMALL2 = 2;
var
hProcess: THandle;
PID: integer;
FileName: array [1..MAX_PATH] of char;
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 (GetOsVersion >= OsWinXP) and (Result = 0) then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL2, 1,
SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
if Result = 0 then Result := GetClassLong(hWnd, GCL_HICONSM);
if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_SMALL,
0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
if (GetOsVersion >= OsWinXP) and (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 Result := GetClassLong(hWnd, GCL_HICON);
if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_BIG,
0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
// Get Icon From File ...
if Result = 0 then
begin
GetWindowThreadProcessId(hWnd, @PID);
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));
CloseHandle(hProcess);
Result := GetFileAssociatedIcon(FileName, true);
if Result = 0 then Result := GetFileAssociatedIcon(FileName, false);
end;
// Load Default Icon ...
if Result = 0 then Result := LoadIcon(0, IDI_APPLICATION);
end; // End of function GetIconFromWindow
//------------------------------------------------------------------------------
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c