![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как изменить содержимое Edita чужой программы [D7, WinXP]
carmen © (2005-05-27 22:51:00)Имеет чужая программа. Мне нужно в поле ввода вводить автоматом свои значения. Я пробую делать так:
Var Hnd,HndDialog,HndControl,HndAsc,HndBtn :HWnd;
StrClass :PChar;
StrBase :string;
begin
Hnd:=FindWindow(nil, 'Parametrs'); // Работает
if Hnd <>0 then
begin
windows.SetForegroundWindow(Hnd); // Устанавливаю фокус
HndControl:=0;
// Здесь у меня всегда возвращает 0, где моя ошибка
HndControl:=FindWindowEx(Hnd,0,nil,pchar('123')); // В поле ввода первоначально стоит значение 123
if HndControl<>0 then
begin
StrBase:='1234';
Sleep(1000);
SendMessage(HndControl, WM_Settext,0,Integer(StrBase));
SendMessage(HndDialog,WM_Command,MakeWParam (1,$0f),HndControl);
End;
End;
У меня получается найти Hnd, а вот найти HndControl не получается, всегда возвращается значение 0.
Як правильно надо делать.
Игорь Шевченко (2005-05-30 11:10:00) [1]Winsight в руки для поиска правильных заголовков и классов окон. Идет в стандартной поставке Delphi
Marser (2005-05-29 10:53:00) [2]
> carmen © (29.05.05 10:50) [29] [Новое
>сообщение][Ответить]
> В паралельном потоке я ищу окно с ошибкой.
Покажи код потока.
carmen (2005-05-29 10:50:00) [3]В паралельном потоке я ищу окно с ошибкой.
Marser (2005-05-28 15:48:00) [4]
>T1 := TMyThread1.Create(True);
> SendMessage(HndControl,BM_Click,0,0);
> t1.Terminate;
Маразм крепчал...
carmen (2005-05-28 09:40:00) [5]Пробую искать окно сообщения в потоке:
HndControl:=FindWindowEx(Hnd,0,pchar('TBitBtn'),'Ïóñê');
if HndControl0 then
begin
T1 := TMyThread1.Create(True);
SendMessage(HndControl,BM_Click,0,0);
t1.Terminate;
End;
Но и поток не работает пока не нажата мной кнопка?
Как мне нажать всетаки кнопку, чтобы моя прога не останавливалась на этом месте?
carmen (2005-05-28 08:48:00) [6]Так всеравно прога ждет моего нажатия на кнопку "ОК"
Marser (2005-05-28 02:33:00) [7]
> SendMessage (HndControl,BN_CLICKED, 0,0);
Неправильно. BM_CLICK. BN_CLICKED это не в ту степь.
carmen (2005-05-28 02:19:00) [8]кнопку "Пуск" я нажимаю так:
SendMessage (HndControl,BN_CLICKED, 0,0);
и после этого моя прога ждет когда я нажму на кнопку "ОК" в появившемся окне. Тоесть, оператори идующие после этой команди ждут моего нажатия кнопки. Как можно нажать кнопку, чтобы самому не нажимать?
Marser (2005-05-28 01:54:00) [9]Определи GetForeGroundWindow после нажатия на "Пуск". Если это что-то новое, то по каким-либо признакам желательно убедиться, что это всё-таки messagedlg, после чего кликруть по кнопке(которую тоже нужно найти)
carmen (2005-05-28 01:46:00) [10]Но у меня попрежнему проблема с вопросом 15. Как правильно програмно нажать на кнопку "Пуск" и продолжить работу моей програмы (чтобы мне не приходилось самому в чужой проге нажимать кнопку "ОК", если выскочила ошибка)
Marser (2005-05-28 01:38:00) [11]Так же, только нужно отловить HWND MessageDlg, а далее согласно иснтрукции.
carmen (2005-05-28 01:28:00) [12]Окно в котором нужно нажать кнопку создается следуэщим образом:
MessageDlg('Error in parameters', mtWarning, [mbOk], 0);
Вот как нажать эту кнопку "ОК"
carmen (2005-05-28 00:44:00) [13]А подругому никак нельзя нажать на это кнопку "ОК"
Marser (2005-05-28 00:27:00) [14]Конечно, можно косвенными действиями(например, если после ошибки текст стирается) узнать об ошибки или отловить messagebox с помощью getforegroundwindow, но всё это вряд ли. Скорее всего, придется перехватывать соответствующие сообщения или даже вызовы.
http://www.rsdn.ru/article/baseserv/winhooks.xml
carmen (2005-05-28 00:19:00) [15]А по подробне можна?
Marser (2005-05-28 00:18:00) [16]Хук ставить нужно, притом глобальный.
carmen (2005-05-28 00:15:00) [17]Сейчас я програмно нахожу нужное мне поле ввода, ввожу туда свое значение, нахожу кнопку "Пуск" и нажимаю ее (как описано выше). Если данные неправильнее чужая программа выдает сообщение об ощибке. Вопрос в том как узнать что сообщение о ошибки появилось и нажать в этом сообщение на кнопку "ОК".
Marser (2005-05-28 00:09:00) [18]Переформулируй вопрос.
carmen (2005-05-28 00:03:00) [19]Да это сработало.
Мне нужно чтобы моя програма нажала в чужой на кнопку "Пуск", если чужая програма выдает окно (заголовок 'Warning') с ощибкой моя должна нажать на кнопку "ОК" этого окна.
Пробую делать так:
HndControl:=FindWindowEx(Hnd,0,pchar('TBitBtn'),'Пуск');
if HndControl<>0 then
begin
SendMessage(HndControl,BM_Click,0,0);
while HndAsc=0 do HndAsc:= FindWindow(nil, 'Warning');
if HndAsc<>0 then
begin
End;
Да программа находит кнопку "Пуск", нажимает ее, чужая программа выдает окно с ошибкой. Далше моя программа ждет когда я мышкой нажму на кнопку "Ок" этого окна и работает дальше. Как правильно сделать, чтобы моя прога сама нажимала на кнопку "Ок" и продалжала свою работу дальше.
Marser (2005-05-27 23:52:00) [20]Сообщения.
BM_CLICK и т.д.