Страница 1 из 1
Как нажать кнопку класса TSpeedButton из внешнего приложения
Добавлено: 03 фев 2005, 02:02
HKarel
У сторонней прораммы есть два edit-а и SpeedButton-кнопка. Требуется запустить программу из своего приложения, заполнить едиты инфой и нажать на конпку.
С запуском и заполнением вроде все понятно, а вот с нажатием на кнопку возникли трудности. Подскажите, плз. как это можно сделать.
Добавлено: 03 фев 2005, 11:24
Romeo
А что, стандартный
SendMessage не работает уже?

Добавлено: 03 фев 2005, 14:35
HKarel
SendMessage - работает без проблем, проблема в том чтобы получить хендл кнопки указанного типа, если таковой вообще существует

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