Консультация № 159789
06.02.2009, 19:25
0.00 руб.
0 2 1
Доброго времени суток. Необходимо дождаться появления определенного окна чужой программы. Подскажите пожалуйста как лучше организовать ожидание чтобы не использовать sleep и прочие извращения

Вот код:

Код:
var
Security_handle, Edit_handle, Button1_handle, Conn_info_handle, Success_handle : HWND;
ip, success:pchar;

begin
ip:=pchar('Radmin security: '+Edit1.Text);
success:=pchar(Edit1.Text+' - Telnet');
Security_handle := FindWindow (nil, ip);
If Security_handle <> 0 then begin
Edit_handle := FindWindowEx(Security_handle, 0, 'Edit', '');
SendMessage(Edit_handle, WM_SETTEXT, 0, Integer(PChar('password')));
Button1_handle := FindWindowEx(Security_handle, 0, 'Button', 'OK');
SendMessage(Button1_handle, BM_CLICK, 0, 0);

Sleep(5000); //!!!!

Conn_info_handle:=FindWindow (nil, 'Connection info');
Success_handle:=FindWindow (nil, success);
if (Conn_info_handle <> 0) and (Success_handle=0) then begin
PostMessage(Conn_info_handle,WM_QUIT,0,0)
end
else begin
ShowMessage('GoodPass');


Описание:

Собственно ищет имеется ли окно "Radmin security: + данные из Edit1", если найдено, тогда передает сообщение в Edit этого окна и нажимает на кнопку. После нажатия на кнопку должно появиться окно с заголовком вида "Connection info", время от нажатия на кнопку до появления окна, естественно, каждый раз разное. Поэтому я всунул туда максимальный sleep который возможен, но хотелось бы этого избежать. Помогите примером, буду очень благодарен!

Обсуждение

Неизвестный
06.02.2009, 22:59
общий
это ответ
Здравствуйте, Segey!
Если я правильно понял, то необходимо после отсылки сообщения одному окну дождаться появления другого. Можно использовать просто цикл
repeat
Conn_info_handle:=FindWindow(nil,'Connection info');
until (conn_info_handle<>0); //если окно найдено, программа идет дальше, если нет, то ищет заново

это вместо sleep. Таким образом программа будет проверять нет ли нужного окна, а когда наконец оно появиться, пойдет дальше.
Неизвестный
07.02.2009, 01:05
общий
Эммм... Попробую так, но некоторые придерживаются мнения, что необходимо использовать ловушки. Ваше мнение по этому поводу?

И еще одно: как вы могли заметить в коде ведется поиск двух окон,
Код:
Conn_info_handle:=FindWindow (nil, 'Connection info');
Success_handle:=FindWindow (nil, success);

т.е. при верном вводе значения в Edit чужого окна вылетает одно окошко, а при неверном - совсем другое. Как быть в таком случае?
Форма ответа