Как отправить сообщение.
От: SCrash  
Дата: 08.07.03 11:06
Оценка:
Привет всем!

У меня возник вопрос:
Можно ли при помощи своей программы "нажимать" кнопку в другой программе? Извините за тавтологию, сейчас поясню суть.

Мне приходиться очень много за день создавать отчеты при помощи программы "A". Данные у меня находятся в файлах текстовых.
Это меня уже задолбало ;(((, хочу написать на CBuilder'e программу, которая будет эмулировать нажатия определенных комбинаций клавиш или "button'ов" на программе "A", затем заполнять поля ввода текстом и нажимать Ок.

Подскажите, реально ли внедряться в процесс чужойц проги или может быть надо посылать системные сообщения от своей программы для чужой?
Спасибо!

P.S.: помогите советом или ссылкой на пример, ну уж очень задолбался — уже месяц так работаю ;(, хотя это и не мой профиль кутепастить....
Re: Как отправить сообщение.
От: Demiurg  
Дата: 08.07.03 12:12
Оценка:
Здравствуйте, SCrash, Вы писали:

SC>Привет всем!


SC>У меня возник вопрос:

SC>Можно ли при помощи своей программы "нажимать" кнопку в другой программе? Извините за тавтологию, сейчас поясню суть.


procedure TForm1.Button1Click(Sender: TObject);
var
  H: HWND;
begin
  H := HWND(131128); //Хэндл кнопки пуск :)
  SendMessage(H, WM_LBUTTONDOWN, 0, 0);
  Sleep(20);
  SendMessage(H, WM_LBUTTONUP, 0, 0);
end;


Другое дело как получать хэндлы нужных тебе кнопок. Что могу посоветовать — врубай Spy++, запоминай их капшины...
... << RSDN@Home 1.1 beta 1 >>
Re: Как отправить сообщение.
От: LeXa24  
Дата: 08.07.03 12:13
Оценка:
Здравствуйте, SCrash, Вы писали:

SC>Привет всем!


SC>У меня возник вопрос:

SC>Можно ли при помощи своей программы "нажимать" кнопку в другой программе? Извините за тавтологию, сейчас поясню суть.

SC>Мне приходиться очень много за день создавать отчеты при помощи программы "A". Данные у меня находятся в файлах текстовых.

SC>Это меня уже задолбало ;(((, хочу написать на CBuilder'e программу, которая будет эмулировать нажатия определенных комбинаций клавиш или "button'ов" на программе "A", затем заполнять поля ввода текстом и нажимать Ок.

Есть такая штука Rational Robot. Если я правильно понял проблему, то это как раз то что тебе нужно
Re[2]: Как отправить сообщение.
От: SCrash  
Дата: 08.07.03 13:12
Оценка:
Здравствуйте, Demiurg, Вы писали:



D>
D>procedure TForm1.Button1Click(Sender: TObject);
D>var
D>  H: HWND;
D>begin
D>  H := HWND(131128); //Хэндл кнопки пуск :)
D>  SendMessage(H, WM_LBUTTONDOWN, 0, 0);
D>  Sleep(20);
D>  SendMessage(H, WM_LBUTTONUP, 0, 0);
D>end;
D>


D> Другое дело как получать хэндлы нужных тебе кнопок. Что могу посоветовать — врубай Spy++, запоминай их капшины...


Отлично! Спасибо!
Еще небольшая просьба — не подскажешь, реально таким же способом control Edit заполнить своим текстом?
Re[3]: Как отправить сообщение.
От: Demiurg  
Дата: 08.07.03 13:20
Оценка:
Здравствуйте, SCrash, Вы писали:

D>> Другое дело как получать хэндлы нужных тебе кнопок. Что могу посоветовать — врубай Spy++, запоминай их капшины...


SC>Отлично! Спасибо!

SC>Еще небольшая просьба — не подскажешь, реально таким же способом control Edit заполнить своим текстом?

Реально. Есть сообщение

WM_SETTEXT
wParam = 0; // not used; must be zero
lParam = (LPARAM)(LPCTSTR)lpsz; // address of window-text string

Работать будет, только если в другом сообщении каком-нить тебе потребуется передать данные другому процессу, то может уже и не сработать, так как адресные пространства у процессов разные, а передается, как видишь, адрес строки. Здесь работает потому что Микрософт сама сделала для этого и некоторых других сообщений всю черновую работу по копированию данных в другой процесс и переинициализации адреса. А в общем случае нужно использовать WM_COPYDATA.
Re[4]: Как отправить сообщение.
От: SCrash  
Дата: 08.07.03 15:50
Оценка:
Здравствуйте, Demiurg, Вы писали:

D>Здравствуйте, SCrash, Вы писали:


D>>> Другое дело как получать хэндлы нужных тебе кнопок. Что могу посоветовать — врубай Spy++, запоминай их капшины...


SC>>Отлично! Спасибо!

SC>>Еще небольшая просьба — не подскажешь, реально таким же способом control Edit заполнить своим текстом?

D> Реально. Есть сообщение

D>

D>WM_SETTEXT
D>wParam = 0; // not used; must be zero
D>lParam = (LPARAM)(LPCTSTR)lpsz; // address of window-text string

D> Работать будет, только если в другом сообщении каком-нить тебе потребуется передать данные другому процессу, то может уже и не сработать, так как адресные пространства у процессов разные, а передается, как видишь, адрес строки. Здесь работает потому что Микрософт сама сделала для этого и некоторых других сообщений всю черновую работу по копированию данных в другой процесс и переинициализации адреса. А в общем случае нужно использовать WM_COPYDATA.


Огромное спасибо!
Сейчас буду испытывать!
P.S.: Лень — двигатель прогресса!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.