Форум: "WinAPI";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизВытаскивание иконки ИЗ ЛЮБОГО!!! окна Найти похожие ветки
← →
DVM (2003-01-24 18:25) [0]Иконки я сначала выдергивал:
Icon := GetClassLong(Wnd, GCL_HICONSM);
Так можно получить не все иконки, например TheBat! иконку не отдавал.
Потом я добавил код, который использовал Игорь Шевченко в EnumFunctions. TheBat иконку отдала.
Но все равно некоторые программы (HomeSite4, Диспетчер задач от XP) иконки "не отдают". Как вытащить иконку ИЗ ЛЮБОГО окна?
← →
DVM (2003-01-26 00:42) [1]Неужели никто не знает в чем дело?
← →
}{enon (2003-01-26 09:08) [2]А что если это не иконка, а просто картинка на форме?
← →
dvm (2003-01-26 14:59) [3]Если картинка то х.. с ней. Я написал конкретные программы - как из их окон вытащить иконки. Виндовая панель задач как то же берет.
← →
}{enon (2003-01-26 17:18) [4]А что если взять иконку из EXE-шника?
← →
dvm (2003-01-26 18:02) [5]Я уже думал над этим. Но... Если экзешник большой, то взятие иконки из экзешника меня не устраимвает - медленно (quake3.exe-очень медленно например).
К тому же окно не обязательно связано напрямую с экзешником.
И еще приложение же может менять иконку у окна во время работы программы, а экзешнике всегда одна и та же.
Нет тут дело в чем то другом.
← →
}{enon (2003-01-26 18:21) [6]Может получить изображение окна, иконку можно будет получить как часть картинки.
← →
dvm (2003-01-26 18:29) [7]
> Может получить изображение окна
Можно еще сфотографировать окно фотоаппаратом, потом сходить напечатать, положить в сканер, отсканировать и в фотошопе вырезать иконку :)))
Нет это все не то, да и медленно.
← →
}{enon (2003-01-26 18:32) [8]Фотографируй на цифровой - будет быстрее :)
А почему это медленно, ведь можно взять только квадрат 16х16 и сохранить его.
← →
dvm (2003-01-26 18:37) [9]А если заголовок окна у чела другой высоты (ну поменял он его в настройках оформления)?
Есть еще один минус: а если окно не видно на экране? Минимизировано например.
Не надо искать другой способ.
← →
dvm (2003-01-26 18:45) [10]вобщем сейчас есть вот такой код:
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;
Вытаскивает не все иконки :((( Виндовая панель задач - все.
← →
}{enon (2003-01-26 18:51) [11]Высота окна получаестя просто:
H := GetSystemMetrics(SM_CYSize);
А вот со вторым сложнее, хотя может получится также.
← →
}{enon (2003-01-26 18:55) [12]А что если у окна нет иконки 16х16, а только 32х32?
GetClassLong(Wnd, GCL_HICONSM) может её и не обработать?
P/S/ Может SoftIce"ом обработать таскбар?
← →
dvm (2003-01-26 19:23) [13]Да, у HomeSite, по-видимому, нет маленькой иконки.
Вытащить удалось большую:
SendMessageTimeOut(Wnd, WM_GETICON, ICON_BIG, 0, SMTO_NORMAL, 300, IconBig);
Теперь возникает другой вопрос: как большую иконку превратить в маленькую?
StretchDraw этого делать не может и именно с иконками.
← →
}{enon (2003-01-26 19:31) [14]Сохраняешь иконку в Image1 (LoadFromClipBoard, Assign и т.д.), а потом
image1.Picture.Icon.SaveToFile("YourIcon.ico");
P.S. Позор на мою медную крышку - сразу код нужно было спросить!
← →
DVM (2003-01-27 09:09) [15]Вот так работает всегда:
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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c