Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизКак изменить содержимое Edita чужой программы Найти похожие ветки
← →
carmen © (2005-05-27 22:51) [0]Имеет чужая программа. Мне нужно в поле ввода вводить автоматом свои значения. Я пробую делать так:
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.
Як правильно надо делать.
← →
Marser © (2005-05-27 23:02) [1]
> HndControl:=FindWindowEx(Hnd,0,nil,pchar("123")); // В
> поле ввода первоначально стоит значение
Попробуй так:
HndControl:=FindWindowEx(Hnd,0,"Edit",nil)
← →
carmen © (2005-05-27 23:06) [2]Так тоже не работает
← →
alex-drob (2005-05-27 23:12) [3]HndControl:=FindWindowEx(Hnd,0,pchar("TEdit"),nil)
← →
Marser © (2005-05-27 23:16) [4]
> alex-drob (27.05.05 23:12) [3] [Новое
>сообщение][Ответить]
> HndControl:=FindWindowEx(Hnd,0,pchar("TEdit"),nil)
Если делфийный, то да, но системный класс имено "Edit". И приведение к Pchar делать необязательно.
← →
alex-drob (2005-05-27 23:18) [5]Я согласен со всем, но если
> HndControl:=FindWindowEx(Hnd,0,"Edit",nil)
не работает, то можно попробывать TEdit
← →
Marser © (2005-05-27 23:24) [6]
> alex-drob (27.05.05 23:18) [5]
Пробовать не нужно, нужно брать WinSpect или подобные вещи и узнавать класс контрола. Я перед предыдущим сообщением так и сделал и вновь убдеился, что-таки "TEdit". Но вариантов много, поэтому очень не советую лезть вслепую и предполагать.
← →
carmen © (2005-05-27 23:30) [7]Чужая программа тоже написана на Delphi и используется класс TEdit. Выще приведение замечания тоже не работают
← →
alex-drob (2005-05-27 23:32) [8]
> Marser © (27.05.05 23:24) [6]
> Пробовать не нужно, нужно брать WinSpect
Нужно брать не мне, а тому кто задавал вопрос. Я же не знаю что у него за чужая программа. Я просто предложил вариант.
← →
alex-drob (2005-05-27 23:35) [9]
> carmen © (27.05.05 23:30) [7]
В комплекте Delphi 7 есть WinSight32. Можно запустить её, найти там нужную программу и посмотреть класс.
← →
Marser © (2005-05-27 23:39) [10]
> carmen © (27.05.05 23:30) [7] [Новое
>сообщение][Ответить]
> Чужая программа тоже написана на Delphi и используется
> класс TEdit. Выще приведение замечания тоже не работают
Кнопка расположена непосредственно на форме? Или на панели etc ? Тогда нужно определить и дескриптор этой самой панели, ибо она и будет родительским коном для поля ввода.
← →
carmen © (2005-05-27 23:49) [11]Да Вы правы, поле ввода находилос не на самой форме на GroupBox.
Теперь следующий вопрос как нажать на кнопку класса TBitBtn которая находится на этой же форме (на самой форме, родитель класс TForm).
← →
Marser © (2005-05-27 23:52) [12]Сообщения.
BM_CLICK и т.д.
← →
carmen © (2005-05-28 00:03) [13]Да это сработало.
Мне нужно чтобы моя програма нажала в чужой на кнопку "Пуск", если чужая програма выдает окно (заголовок "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-28 00:09) [14]Переформулируй вопрос.
← →
carmen © (2005-05-28 00:15) [15]Сейчас я програмно нахожу нужное мне поле ввода, ввожу туда свое значение, нахожу кнопку "Пуск" и нажимаю ее (как описано выше). Если данные неправильнее чужая программа выдает сообщение об ощибке. Вопрос в том как узнать что сообщение о ошибки появилось и нажать в этом сообщение на кнопку "ОК".
← →
Marser © (2005-05-28 00:18) [16]Хук ставить нужно, притом глобальный.
← →
carmen © (2005-05-28 00:19) [17]А по подробне можна?
← →
Marser © (2005-05-28 00:27) [18]Конечно, можно косвенными действиями(например, если после ошибки текст стирается) узнать об ошибки или отловить messagebox с помощью getforegroundwindow, но всё это вряд ли. Скорее всего, придется перехватывать соответствующие сообщения или даже вызовы.
http://www.rsdn.ru/article/baseserv/winhooks.xml
← →
carmen © (2005-05-28 00:44) [19]А подругому никак нельзя нажать на это кнопку "ОК"
← →
carmen © (2005-05-28 01:28) [20]Окно в котором нужно нажать кнопку создается следуэщим образом:
MessageDlg("Error in parameters", mtWarning, [mbOk], 0);
Вот как нажать эту кнопку "ОК"
← →
Marser © (2005-05-28 01:38) [21]Так же, только нужно отловить HWND MessageDlg, а далее согласно иснтрукции.
← →
carmen © (2005-05-28 01:46) [22]Но у меня попрежнему проблема с вопросом 15. Как правильно програмно нажать на кнопку "Пуск" и продолжить работу моей програмы (чтобы мне не приходилось самому в чужой проге нажимать кнопку "ОК", если выскочила ошибка)
← →
Marser © (2005-05-28 01:54) [23]Определи GetForeGroundWindow после нажатия на "Пуск". Если это что-то новое, то по каким-либо признакам желательно убедиться, что это всё-таки messagedlg, после чего кликруть по кнопке(которую тоже нужно найти)
← →
carmen © (2005-05-28 02:19) [24]кнопку "Пуск" я нажимаю так:
SendMessage (HndControl,BN_CLICKED, 0,0);
и после этого моя прога ждет когда я нажму на кнопку "ОК" в появившемся окне. Тоесть, оператори идующие после этой команди ждут моего нажатия кнопки. Как можно нажать кнопку, чтобы самому не нажимать?
← →
Marser © (2005-05-28 02:33) [25]
> SendMessage (HndControl,BN_CLICKED, 0,0);
Неправильно. BM_CLICK. BN_CLICKED это не в ту степь.
← →
carmen © (2005-05-28 08:48) [26]Так всеравно прога ждет моего нажатия на кнопку "ОК"
← →
carmen © (2005-05-28 09:40) [27]Пробую искать окно сообщения в потоке:
HndControl:=FindWindowEx(Hnd,0,pchar("TBitBtn"),"Ïóñê");
if HndControl<>0 then
begin
T1 := TMyThread1.Create(True);
SendMessage(HndControl,BM_Click,0,0);
t1.Terminate;
End;
Но и поток не работает пока не нажата мной кнопка?
Как мне нажать всетаки кнопку, чтобы моя прога не останавливалась на этом месте?
← →
Marser © (2005-05-28 15:48) [28]
>T1 := TMyThread1.Create(True);
> SendMessage(HndControl,BM_Click,0,0);
> t1.Terminate;
Маразм крепчал...
← →
carmen © (2005-05-29 10:50) [29]В паралельном потоке я ищу окно с ошибкой.
← →
Marser © (2005-05-29 10:53) [30]
> carmen © (29.05.05 10:50) [29] [Новое
>сообщение][Ответить]
> В паралельном потоке я ищу окно с ошибкой.
Покажи код потока.
← →
Игорь Шевченко © (2005-05-30 11:10) [31]Winsight в руки для поиска правильных заголовков и классов окон. Идет в стандартной поставке Delphi
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.013 c