Как нажать кнопку!!!

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

Ответить
arris
Сообщения: 30
Зарегистрирован: 18 июн 2004, 11:02

Ситуация следующая:
Есть диалоговое окно (считаем внешнее)
Есть приложение, с помощью которого находим это окно. Перебираем его элементы и находим указатель CWnd* на кнопку. Теперь ее нодо нажать.
Если есть способы или рекомендации как это сделать, нанишите.
Заранее благодарен!!!
Конструктор
Сообщения: 35
Зарегистрирован: 12 май 2004, 15:34
Откуда: Москва

Попробуй. У меня на билдере получилось из одного приложения в другом кнопку надавить

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

HWND WinHandle , CtrHandle;
int id;

    //WinHandle - хэндл диалогового окна
    //CtrHandle - хэндл контрола (кнопки)

    id = GetDlgCtrlID(WinHandle);//Получим id кнопки

    //Пошлем сообщение о отм что ее нажали
    SendMessage(WinHandle , WM_COMMAND , (BN_CLICKED << 16) + id , (LONG)CtrHandle); 
maxrus
Сообщения: 5
Зарегистрирован: 19 июн 2004, 12:36
Контактная информация:

больше нечего сказать - SendMessage
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

больше нечего сказать - SendMessage
Черезчур оптимистично. Это конечно способ основной, но не всегда проходит. Если не сработает другой способ состоит в программном перемещении указателя на кнопку и вызова mouse_event() с MOUSEEVENTF_LEFTDOWN/MOUSEEVENTF_LEFTUP.
*provided AS IS
arris
Сообщения: 30
Зарегистрирован: 18 июн 2004, 11:02

Очень благодарен! Спасибо, Конструктор!
Все завелось, правда примерно так:

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

HWND WinHandle , CtrHandle; 
int id; 

    //WinHandle - хэндл диалогового окна 
    //CtrHandle - хэндл контрола (кнопки) 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    id = GetDlgCtrlID(CtrHandle);//Получим id кнопки !!!!!!!!!!!!!!!1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //Пошлем сообщение о отм что ее нажали 
    SendMessage(WinHandle , WM_COMMAND , (BN_CLICKED << 16) + id , (LONG)CtrHandle); 
И еще, Andy, можно чуть поподробнее про указатель. Кажется прийдется реализовать именно так!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Romeo, все нормально, все работает!
Но как объяснишь, что после передачи окну сообщения оно не реагирует, пока не подвигаешь указатель мышки по окну. Я решил эту проблему чуть по другому: после передачи сообщения, вызывал закрытие окна - теперь все работает.
Не знаю, как была построены те окна, с которыми я работаю, но глючат они здорово! Приходится изощьряться разными способами!
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

arris, SetFocus пробовал?
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

И еще, Andy, можно чуть поподробнее про указатель.
Способ с SendMessage не всегда проходит. SendMessage отправляет сообщение только это кнопке, а реального клика, как такового не происходит (а программа может наустановить хуков и т.п. для проверки). Тогда используют ф-ию SendInput (или mouse_event(),keybd_event()) совместно с перемещением указателя мыши в нужную точку путем SetCursorPos(). Они как бы имитируют действия пользователя.
Не знаю, как была построены те окна, с которыми я работаю, но глючат они здорово! Приходится изощьряться разными способами!
Вот-вот.
*provided AS IS
Ответить