Как нажать кнопку класса TSpeedButton из внешнего приложения

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

У сторонней прораммы есть два edit-а и SpeedButton-кнопка. Требуется запустить программу из своего приложения, заполнить едиты инфой и нажать на конпку.
С запуском и заполнением вроде все понятно, а вот с нажатием на кнопку возникли трудности. Подскажите, плз. как это можно сделать.
Сложность - это мера непонимания.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А что, стандартный SendMessage не работает уже? :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

SendMessage - работает без проблем, проблема в том чтобы получить хендл кнопки указанного типа, если таковой вообще существует :(
Сложность - это мера непонимания.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Есть два способа:

1. Получить HWND элемента можно по его координатам. Сначала нужно получить координаты самой формы приложения функцией GetWindowRect(). Потом, зная координаты элемента на форме, можно получить его координаты на экране с помощью функции ClientToScreen(). Далее вызываешь функцию WindowFromPoint() с указанием координат элемента и получаешь его HWND.

2. С помощью функции EnumChildWindows(). В качестве параметра ей передаётся HWND формы и CALLBACK-процедура, в которую поочерёдно передаются HWND всех дочерних элементов формы.
С помощью функции GetClassName() ты получаешь имена оконных классов этих элементов. В платформе VCL имена оконных классов VCL-компонентов совпадают с именами их классов для языка С++ или Object Pascal. Поэтому для типа TSpeedButton имя оконного класса тоже будет "TSpeedButton". Сравнивая имена оконных классов ты можешь найти те элементы, которые тебе нужны.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

TSpeedButton - неоконный компонент, нет у него хэндла => сообщения ему не послать, по крайней мере, извне.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Можно попробовать эмуляцию нажатия и отпускания клавиши мыши в указанных координатах с помощью функции mouse_event(). Я уже делал так с программой "Калькулятор", у меня получалось.
Или можно окну формы отправить сообщение WM_LBUTTONDOWN и WM_LBUTTONUP, указав координаты относительно клиентской части окна.
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

На данный момент решил проблему "в лоб" эмуляцией клика по форме:

Код: Выделить всё

  
  LPARAM lParam = MAKELPARAM( 80, 90 );
  PostMessage( hWnd, WM_LBUTTONDOWN, 0, lParam );
  PostMessage( hWnd, WM_LBUTTONUP,   0, lParam );
Сложность - это мера непонимания.
Ответить