Показать полную графическую версию : Закрыть незакрываймое окно!
D@n1k007
13-02-2010, 19:54
Здравствуйте!
Недавно снова установил Alcohol 120%. Мне стало интересно как закрыть окно приветствия в нем, то которое типо "О программе" и висит 10 секунд?
Как я выяснил окно это - дочернее и пока не пройдет счетчик (10 секунд ожидания) окно не закроется. Попробовал написать так:
PostMessage(FindWindow(nil, 'О программе - Alcohol 120%'), wm_quit, 0, 0);
Окошко закрылось, но вмести с ним закрылась и все прога (главное окно появилось на экране и тут же пропало)
Что можете посоветовать? Отдельная просьба не высказывать предложения по установке креков и покупки лицензии на Alcohol 120%! Я не собираюсь ломать Alcohol 120% (меня устраивает 15-дневный пробный период) мне это нужно как полигон для обучения!
Заранее благодарен!!!
D@n1k007, PostMessage в альянсе с параметром wm_quit как раз и отправляют процессу, а не отдельно взятому окну, команду закончить работу.
Данное ПО не установлено, так что не проверял. А что если отправить сообщение одноимённой функцией SendMessage с параметром WM_CLOSE?
SendMessage(FindWindow(nil, 'О программе - Alcohol 120%'), WM_CLOSE, 0, 0)
grafmoto
13-02-2010, 23:07
или просто спрятать его:
ShowWindow(FindWindow(nil, 'О программе - Alcohol 120%'), SW_HIDE);
D@n1k007
14-02-2010, 12:15
SendMessage(FindWindow(nil, 'О программе - Alcohol 120%'), WM_CLOSE, 0, 0);
не работает пока не закончится таймер
ShowWindow(FindWindow(nil, 'О программе - Alcohol 120%'), SW_HIDE);
только скрывает, а не закрывает окно (следовательно главное окно не откроется)
Вот блин головоломку придумал :(
crashtuak
14-02-2010, 12:33
D@n1k007, закрыть окно не выйдет, потому что таймер соравно будет работать. Копать нужно именно в сторону таймера. Побороть таймер=побороть окно.
El Scorpio
15-02-2010, 03:17
Отдельная просьба не высказывать предложения по установке креков и покупки лицензии на Alcohol 120%! »
А*предложения по установке бесплатной версии Alcogol 52% (в которой отсутствуют функции записи дисков)?
D@n1k007
15-02-2010, 21:59
2 El Scorpio
Звучит нелепо, но смыл не в том чтобы пользоваться Alcohol :blush2:, смысл в том чтобы закрыть это окно! :) Я же писал выше мне это нужно как полигон для обучения »
У меня появилась идея, только возник ряд проблем и без помощи мне не обойтись:
var h1, h2: hwnd;
...
begin
h1 := FindWindow(nil, 'О программе - Alcohol 120%');
h2 := FindWindowEx(h1, 0, 'TButton', '&OK');
showmessage(inttostr(h2));
end;
Этим кодом я хочу найти кнопку ОК, но при попытке ее найти всегда возвращается 0. Пробовал печатать - "ОК" и по-русски и по-английски, пробовал получать ответ когда кнопка пассивна и активна, результат всегда 0 :(
Что я делаю не так? (Пробовал с другим приложением тоже не смог найти кнопку)
Прилагаю картинки!
1) А сначала TPanel если поискать (а на нём TButton)?
2) Победил таймер?
ничё у тебя оперативки то! hypernate.sys наверное половину загрузочного раздела занимает :)
El Scorpio
16-02-2010, 01:20
Этим кодом я хочу найти кнопку ОК, но при попытке ее найти всегда возвращается 0. Пробовал печатать - "ОК" и по-русски и по-английски, пробовал получать ответ когда кнопка пассивна и активна, результат всегда 0 »
А*если циклом считать текстовые свойства всех экранных элементов?
Глядишь, что-нибудь интересное найдётся.
D@n1k007
16-02-2010, 16:37
Сейчас расскажу суть моей идеи:
Я хотел с помощью кода, приведенного ниже, активировать кнопку ОК, в надежде что нажав на нее окно закроется, но увы... Кнопка стала активной, окно не закрылось! :(
begin
h1 := FindWindow(nil, 'О программе - Alcohol 120%');
h3 := FindWindowEx(h1, 0, 'TPanel', nil);
h2 := FindWindowEx(h3, 0, 'TButton', nil);
EnableWindow(h2, true);
end;
2 El Scorpio
А*если циклом считать текстовые свойства всех экранных элементов? » Как это? Я еще не очень опытный в программировании, вы могли бы рассказать подробнее?
2 ALL
1. Как победить таймер? Как его можно поставить в значение 0? Может есть какие-то свойства/сообщения/доп. параметры для команды WM_TIMER (вообще уместно ли ее тут использовать)?
2. Можно ли узнать сообщение которое кнопка ОК посылает окну?
кнопка посылает WM_COMMAND: wparam=ID, lparam=hwnd. Дальше первый поймавший сообщение находит у приславшего указатель на TControl и отправляет ему обратно сообщение CM_COMMAND ( = 0x3000 + WM_COMMAND), которое и обрабатывается самой же кнопкой (её обёрткой VCL).
Скорее всего таймер использует сообщение WM_TIMER. Если при этом для вычисления оставшегося кол-ва секунд используется формула GetTickCount() - start_time (а таймер только для обновления экрана), то фокус не прокатит. Если используется аргумент wparam сообщения WM_TIMER, то достаточно один раз послать WM_TIMER с wparam=GetTickCount()+8000. Если сообщение таймера используется для увеличения счётчика (на единицу), значит надо послать сколько нужно раз это сообщение. Ещё можно изменить период таймера функцией SetTimer. В любом случае понадобится ID таймера и параметр lparam, который он использует, а их можно узнать только поймав "родное" сообщение WM_TIMER.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC