Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить, что приложение освободилось?


И. Павел ©   (2010-06-08 13:17:00) 

Здравствуйте.

Моя программа должна управлять другим приложением, посылая ему сообщения.
Например, мне нужно нажать на кнопку (HBut) в чужом приложении (точнее это какая-то панель, т.е. класс не button). После этого изменится текст в окне HTxt (хотя он может и остаться прежним). На основании нового текста моя программа решает: стоит ли нажать на кнопку второй раз (это утрировано, но суть примерно в этом).

SendMessage(HBut, WM_LBUTTONDOWN, 0, 0);
SendMessage(HBut, WM_LBUTTONUP, 0, 0);
SendMessage(HTxt, WM_GETTEXT, WParam(StrBufSize(s)), LParam(s));
//что сюда написать – не знаю
if s = ‘12345’ then
begin
 SendMessage(HBut, WM_LBUTTONDOWN, 0, 0);
 SendMessage(HBut, WM_LBUTTONUP, 0, 0);
end;

Возникшая у меня проблема заключается в том, что текст в HTxt не успевает поменяться между нажатием и WM_GetText.

У меня была идея – отлавливать через хуки сообщение Idle для чужой программы. Но в этом случае нельзя будет сказать – связано сообщение с завершением обработки нажатия на кнопку или с более ранними действиями.

Подскажите, пожалуйста, как решить эту проблему? Можно ли в этом случае как-то использовать Idle (и как), или что-то другое? Можно ли что-нибудь написать перед if, чтобы дождаться обработки нажатия на кнопку?

Заранее спасибо.


И. Павел   (2010-06-08 13:40:00) [1]

> Хук на подопытный поток обязателен (я уж ранее говорил).
> Хотя бы для уведомлений о разрушении нужных окон.

Окна вряд ли будут закрываться просто так, т.к. программа будет работать на единственной машине, и возможно даже без пользователя.
Но я на всякий случай сделаю отлов Destroy, спасибо.


Leonid Troyanovsky   (2010-06-08 13:34:00) [2]


> И. Павел ©   (08.06.10 13:17)  

>  SendMessage(HBut, WM_LBUTTONDOWN, 0, 0);

Лучше слать BM_CLICK или WM_COMMAND паренту,
с идентификатором кнопки.

--
Regards, LVT.


И. Павел   (2010-06-08 13:29:00) [3]

> RWolf ©   (08.06.10 13:19)

Огромное вам спасибо! :)


Leonid Troyanovsky   (2010-06-08 13:29:00) [4]


> И. Павел ©   (08.06.10 13:17)  

> Подскажите, пожалуйста, как решить эту проблему? Можно ли
> в этом случае как-то использовать Idle (и как), или что-
> то другое?

Хук на подопытный поток обязателен (я уж ранее говорил).
Хотя бы для уведомлений о разрушении нужных окон.

Хуков можно установить несколько, в т.ч. WH_FOREGROUNDIDLE.
В рассматриваемом случае можно следить  (WH_CALLWNDPROC*)
за WM_СOMMAND with EN_CHANGE | EN_UPDATE, посылаемыми
паренту этого эдита, если это, конечно, эдит.

--
Regards, LVT.


RWolf   (2010-06-08 13:19:00) [5]

WaitForInputIdle?


Наверх

Титульная страница Поиск, карта сайта Написать письмо