![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вытаскивание иконки ИЗ ЛЮБОГО!!! окна [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]Неужели никто не знает в чем дело?