Родились сегодня:
goldssky@yandex.ru


Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

768

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

342

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

278

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

211

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

148

Беларусь, Гомель


ID: 400815

alexleonsm

6-й класс

130


ID: 400669

epimkin

Профессионал

120


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-14 03:16:12-standard


Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 159789

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Segey
Дата: 06.02.2009, 19:25 Консультация закрыта
Поступило ответов: 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 который возможен, но хотелось бы этого избежать. Помогите примером, буду очень благодарен!

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

это вместо sleep. Таким образом программа будет проверять нет ли нужного окна, а когда наконец оно появиться, пойдет дальше.

Mixala

Посетитель
06.02.2009, 22:59
Мини-форум консультации # 159789
неизвестный

1

= общий =    07.02.2009, 01:05

Эммм... Попробую так, но некоторые придерживаются мнения, что необходимо использовать ловушки. Ваше мнение по этому поводу?

И еще одно: как вы могли заметить в коде ведется поиск двух окон,

Код
Conn_info_handle:=FindWindow (nil, 'Connection info');
Success_handle:=FindWindow (nil, success);

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

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

puporev

Профессор

Рейтинг: 111

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 74

Степанов Иван /REDDS

4-й класс

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0

Орловский Дмитрий

Мастер-Эксперт

Рейтинг: 0