Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Закрыть незакрываймое окно! (http://forum.oszone.net/showthread.php?t=167264)

D@n1k007 13-02-2010 19:54 1346400

Закрыть незакрываймое окно!
 
Здравствуйте!
Недавно снова установил Alcohol 120%. Мне стало интересно как закрыть окно приветствия в нем, то которое типо "О программе" и висит 10 секунд?
Как я выяснил окно это - дочернее и пока не пройдет счетчик (10 секунд ожидания) окно не закроется. Попробовал написать так:
Код:

PostMessage(FindWindow(nil, 'О программе - Alcohol 120%'), wm_quit, 0, 0);
Окошко закрылось, но вмести с ним закрылась и все прога (главное окно появилось на экране и тут же пропало)
Что можете посоветовать? Отдельная просьба не высказывать предложения по установке креков и покупки лицензии на Alcohol 120%! Я не собираюсь ломать Alcohol 120% (меня устраивает 15-дневный пробный период) мне это нужно как полигон для обучения!
Заранее благодарен!!!

Admiral 13-02-2010 22:57 1346535

D@n1k007, PostMessage в альянсе с параметром wm_quit как раз и отправляют процессу, а не отдельно взятому окну, команду закончить работу.
Данное ПО не установлено, так что не проверял. А что если отправить сообщение одноимённой функцией SendMessage с параметром WM_CLOSE?
SendMessage(FindWindow(nil, 'О программе - Alcohol 120%'), WM_CLOSE, 0, 0)

grafmoto 13-02-2010 23:07 1346544

или просто спрятать его:
ShowWindow(FindWindow(nil, 'О программе - Alcohol 120%'), SW_HIDE);

D@n1k007 14-02-2010 12:15 1346758

Код:

SendMessage(FindWindow(nil, 'О программе - Alcohol 120%'), WM_CLOSE, 0, 0);
не работает пока не закончится таймер
Код:

ShowWindow(FindWindow(nil, 'О программе - Alcohol 120%'), SW_HIDE);
только скрывает, а не закрывает окно (следовательно главное окно не откроется)
Вот блин головоломку придумал :(

crashtuak 14-02-2010 12:33 1346772

D@n1k007, закрыть окно не выйдет, потому что таймер соравно будет работать. Копать нужно именно в сторону таймера. Побороть таймер=побороть окно.

El Scorpio 15-02-2010 03:17 1347328

Цитата:

Цитата D@n1k007
Отдельная просьба не высказывать предложения по установке креков и покупки лицензии на Alcohol 120%! »

А*предложения по установке бесплатной версии Alcogol 52% (в которой отсутствуют функции записи дисков)?

D@n1k007 15-02-2010 21:59 1348006

Вложений: 3
2 El Scorpio
Звучит нелепо, но смыл не в том чтобы пользоваться Alcohol :blush2:, смысл в том чтобы закрыть это окно! :) Я же писал выше
Цитата:

Цитата D@n1k007
мне это нужно как полигон для обучения »

У меня появилась идея, только возник ряд проблем и без помощи мне не обойтись:
Код:

var h1, h2: hwnd;
...
begin
  h1 := FindWindow(nil, 'О программе - Alcohol 120%');
  h2 := FindWindowEx(h1, 0, 'TButton', '&OK');
  showmessage(inttostr(h2));
end;

Этим кодом я хочу найти кнопку ОК, но при попытке ее найти всегда возвращается 0. Пробовал печатать - "ОК" и по-русски и по-английски, пробовал получать ответ когда кнопка пассивна и активна, результат всегда 0 :(
Что я делаю не так? (Пробовал с другим приложением тоже не смог найти кнопку)
Прилагаю картинки!

pva 15-02-2010 22:29 1348031

1) А сначала TPanel если поискать (а на нём TButton)?
2) Победил таймер?
ничё у тебя оперативки то! hypernate.sys наверное половину загрузочного раздела занимает :)

El Scorpio 16-02-2010 01:20 1348176

Цитата:

Цитата D@n1k007
Этим кодом я хочу найти кнопку ОК, но при попытке ее найти всегда возвращается 0. Пробовал печатать - "ОК" и по-русски и по-английски, пробовал получать ответ когда кнопка пассивна и активна, результат всегда 0 »

А*если циклом считать текстовые свойства всех экранных элементов?
Глядишь, что-нибудь интересное найдётся.

D@n1k007 16-02-2010 16:37 1348664

Сейчас расскажу суть моей идеи:
Я хотел с помощью кода, приведенного ниже, активировать кнопку ОК, в надежде что нажав на нее окно закроется, но увы... Кнопка стала активной, окно не закрылось! :(
Код:

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
Цитата:

Цитата El Scorpio
А*если циклом считать текстовые свойства всех экранных элементов? »

Как это? Я еще не очень опытный в программировании, вы могли бы рассказать подробнее?

2 ALL
1. Как победить таймер? Как его можно поставить в значение 0? Может есть какие-то свойства/сообщения/доп. параметры для команды WM_TIMER (вообще уместно ли ее тут использовать)?
2. Можно ли узнать сообщение которое кнопка ОК посылает окну?

pva 16-02-2010 22:39 1348929

кнопка посылает 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.


Время: 20:32.

Время: 20:32.
© OSzone.net 2001-