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

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

Сложность - это мера непонимания.
Есть два способа:
1. Получить HWND элемента можно по его координатам. Сначала нужно получить координаты самой формы приложения функцией GetWindowRect(). Потом, зная координаты элемента на форме, можно получить его координаты на экране с помощью функции ClientToScreen(). Далее вызываешь функцию WindowFromPoint() с указанием координат элемента и получаешь его HWND.
2. С помощью функции EnumChildWindows(). В качестве параметра ей передаётся HWND формы и CALLBACK-процедура, в которую поочерёдно передаются HWND всех дочерних элементов формы.
С помощью функции GetClassName() ты получаешь имена оконных классов этих элементов. В платформе VCL имена оконных классов VCL-компонентов совпадают с именами их классов для языка С++ или Object Pascal. Поэтому для типа TSpeedButton имя оконного класса тоже будет "TSpeedButton". Сравнивая имена оконных классов ты можешь найти те элементы, которые тебе нужны.
1. Получить HWND элемента можно по его координатам. Сначала нужно получить координаты самой формы приложения функцией GetWindowRect(). Потом, зная координаты элемента на форме, можно получить его координаты на экране с помощью функции ClientToScreen(). Далее вызываешь функцию WindowFromPoint() с указанием координат элемента и получаешь его HWND.
2. С помощью функции EnumChildWindows(). В качестве параметра ей передаётся HWND формы и CALLBACK-процедура, в которую поочерёдно передаются HWND всех дочерних элементов формы.
С помощью функции GetClassName() ты получаешь имена оконных классов этих элементов. В платформе VCL имена оконных классов VCL-компонентов совпадают с именами их классов для языка С++ или Object Pascal. Поэтому для типа TSpeedButton имя оконного класса тоже будет "TSpeedButton". Сравнивая имена оконных классов ты можешь найти те элементы, которые тебе нужны.
TSpeedButton - неоконный компонент, нет у него хэндла => сообщения ему не послать, по крайней мере, извне.
Можно попробовать эмуляцию нажатия и отпускания клавиши мыши в указанных координатах с помощью функции mouse_event(). Я уже делал так с программой "Калькулятор", у меня получалось.
Или можно окну формы отправить сообщение WM_LBUTTONDOWN и WM_LBUTTONUP, указав координаты относительно клиентской части окна.
Или можно окну формы отправить сообщение WM_LBUTTONDOWN и WM_LBUTTONUP, указав координаты относительно клиентской части окна.
На данный момент решил проблему "в лоб" эмуляцией клика по форме:
Код: Выделить всё
LPARAM lParam = MAKELPARAM( 80, 90 );
PostMessage( hWnd, WM_LBUTTONDOWN, 0, lParam );
PostMessage( hWnd, WM_LBUTTONUP, 0, lParam );
Сложность - это мера непонимания.