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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
14-1077629736
kaif
2004-02-24 16:35
2004.03.28
Отставка правительства?


14-1078073836
syte_ser78
2004-02-29 19:57
2004.03.28
Как подменить УРЛ в WebBrowser


1-1078990342
BorisMor
2004-03-11 10:32
2004.03.28
Определить зарегистрирован ли ОСХ


14-1078005132
Undert
2004-02-29 00:52
2004.03.28
Во, крутой вопросик


14-1074853862
Andrew
2004-01-23 13:31
2004.03.28
delphi for .net