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

Вниз

Вытаскивание иконки ИЗ ЛЮБОГО!!! окна   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2003.03.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
6-64248
sergey2
2003-01-29 09:32
2003.03.20
Как в TWebBrowser отключить фрейм зная его номер?


1-64108
ShurikM
2003-03-09 00:37
2003.03.20
Bitmap на форме


14-64372
Соприкоснувшийся
2003-03-05 14:10
2003.03.20
О продаже программы


3-64030
marco
2003-03-01 13:50
2003.03.20
Добавление полей в таблицу


14-64364
valery
2003-03-05 11:43
2003.03.20
Ищу средство для документации Delphi-проектов(аналог javadoc)