Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как изменить содержимое Edita чужой программы [D7, WinXP]


Страницы:   1 2

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 и т.д.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо