Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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"),"&#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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.013 c
3-1118421086
ctudent
2005-06-10 20:31
2005.07.25
Построение отчётов используя Midas.


1-1120482619
vigo
2005-07-04 17:10
2005.07.25
Работа с несколькими компонентами


1-1120934152
Michael5
2005-07-09 22:35
2005.07.25
Научите сплиттером пользоваться!


8-1111666278
Romantic
2005-03-24 15:11
2005.07.25
Инвертирование при видеозахвате


10-1097076855
vixic
2004-10-06 19:34
2005.07.25
COM и события





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский