Вниз
Скачать: CL | DM;

Как изменить содержимое 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"),"&#207;&#243;&#241;&#234;");
  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 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.025 c
14-1120213939
Игорь Шевченко
2005-07-01 14:32
2005.07.25
Есть ли в природе news-reader


3-1118387635
stud
2005-06-10 11:13
2005.07.25
чтение параметров из blolb


14-1119856274
Holy
2005-06-27 11:11
2005.07.25
Athlon 64


1-1120466806
NightStranger
2005-07-04 12:46
2005.07.25
Как загрузить файл из интернета


8-1111615744
Citizen
2005-03-24 01:09
2005.07.25
Максимально быстро подготовить картинку для передачи по сети




   Наверх