Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вытаскивание иконки ИЗ ЛЮБОГО!!! окна [D6, WinXP]


DVM ©   (2003-01-24 18:25:00) 

Иконки я сначала выдергивал:
Icon := GetClassLong(Wnd, GCL_HICONSM);
Так можно получить не все иконки, например TheBat! иконку не отдавал.
Потом я добавил код, который использовал Игорь Шевченко в EnumFunctions. TheBat иконку отдала.
Но все равно некоторые программы (HomeSite4, Диспетчер задач от XP) иконки "не отдают". Как вытащить иконку ИЗ ЛЮБОГО окна?


DVM   (2003-01-27 09:09:00) [1]

Вот так работает всегда:

function GetIconFromWindow(Wnd:HWND; BigIcon:boolean):THandle;
var
BigOrSmall,BigOrSmall2:integer;
HIcon:THandle;
begin
hIcon:=0;
if BigIcon then
begin
BigOrSmall:=ICON_BIG;
BigOrSmall2:=GCL_HICON;
end
else
begin
BigOrSmall:=ICON_SMALL;
BigOrSmall2:=GCL_HICONSM;
end;
SendMessageTimeout(Wnd, WM_GETICON, BigOrSmall, 0, SMTO_ABORTIFHUNG, 1000, HIcon);
if hIcon=0 then hIcon := GetClassLong(Wnd, BigOrSmall2);
if hIcon=0 then SendMessageTimeout(Wnd, WM_GETICON, BigOrSmall, 1,
SMTO_ABORTIFHUNG, 1000, hIcon);
if hIcon=0 then hIcon := GetClassLong(Wnd, BigOrSmall2);
if hIcon=0 then SendMessageTimeout(Wnd, WM_QUERYDRAGICON, BigOrSmall,
0, SMTO_ABORTIFHUNG, 1000, hIcon);
result:=hIcon;
end;


}{enon   (2003-01-26 19:31:00) [2]

Сохраняешь иконку в Image1 (LoadFromClipBoard, Assign и т.д.), а потом
image1.Picture.Icon.SaveToFile("YourIcon.ico");

P.S. Позор на мою медную крышку - сразу код нужно было спросить!


dvm   (2003-01-26 19:23:00) [3]

Да, у HomeSite, по-видимому, нет маленькой иконки.
Вытащить удалось большую:

SendMessageTimeOut(Wnd, WM_GETICON, ICON_BIG, 0, SMTO_NORMAL, 300, IconBig);

Теперь возникает другой вопрос: как большую иконку превратить в маленькую?
StretchDraw этого делать не может и именно с иконками.



}{enon   (2003-01-26 18:55:00) [4]

А что если у окна нет иконки 16х16, а только 32х32?
GetClassLong(Wnd, GCL_HICONSM) может её и не обработать?
P/S/ Может SoftIce"ом обработать таскбар?


}{enon   (2003-01-26 18:51:00) [5]

Высота окна получаестя просто:
H := GetSystemMetrics(SM_CYSize);
А вот со вторым сложнее, хотя может получится также.


dvm   (2003-01-26 18:45:00) [6]

вобщем сейчас есть вот такой код:

IconSm := GetClassLong(Wnd, GCL_HICONSM);
if IconSm = 0 then
if SendMessageTimeOut(Wnd, WM_GETICON, ICON_SMALL, 0, SMTO_NORMAL, 300, IconSm) = 0 then IconSm := 0;
if IconSm <> 0 then
begin
Icon := TIcon.Create();
Icon.Handle := IconSm;
...
end;
end;

Вытаскивает не все иконки :((( Виндовая панель задач - все.


dvm   (2003-01-26 18:37:00) [7]

А если заголовок окна у чела другой высоты (ну поменял он его в настройках оформления)?
Есть еще один минус: а если окно не видно на экране? Минимизировано например.
Не надо искать другой способ.


}{enon   (2003-01-26 18:32:00) [8]

Фотографируй на цифровой - будет быстрее :)
А почему это медленно, ведь можно взять только квадрат 16х16 и сохранить его.


dvm   (2003-01-26 18:29:00) [9]


> Может получить изображение окна

Можно еще сфотографировать окно фотоаппаратом, потом сходить напечатать, положить в сканер, отсканировать и в фотошопе вырезать иконку :)))
Нет это все не то, да и медленно.



}{enon   (2003-01-26 18:21:00) [10]

Может получить изображение окна, иконку можно будет получить как часть картинки.


dvm   (2003-01-26 18:02:00) [11]

Я уже думал над этим. Но... Если экзешник большой, то взятие иконки из экзешника меня не устраимвает - медленно (quake3.exe-очень медленно например).
К тому же окно не обязательно связано напрямую с экзешником.
И еще приложение же может менять иконку у окна во время работы программы, а экзешнике всегда одна и та же.
Нет тут дело в чем то другом.


}{enon   (2003-01-26 17:18:00) [12]

А что если взять иконку из EXE-шника?


dvm   (2003-01-26 14:59:00) [13]

Если картинка то х.. с ней. Я написал конкретные программы - как из их окон вытащить иконки. Виндовая панель задач как то же берет.


}{enon   (2003-01-26 09:08:00) [14]

А что если это не иконка, а просто картинка на форме?


DVM   (2003-01-26 00:42:00) [15]

Неужели никто не знает в чем дело?


Наверх

Титульная страница Поиск, карта сайта Написать письмо