Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-1078401813
Аноним
2004-03-04 15:03
2004.03.28
Потоки


14-1077960542
Morfey
2004-02-28 12:29
2004.03.28
Как изменить анкету???


14-1078214920
ИМХО
2004-03-02 11:08
2004.03.28
Кто что скажет за Тайвань?


3-1077182609
RavenD
2004-02-19 12:23
2004.03.28
утилиты?


3-1077959547
Michail Dalakov
2004-02-28 12:12
2004.03.28
Oracle и побитовые операции





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский