Страница 1 из 1

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

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

Добавлено: 18 июн 2004, 13:03
Конструктор
Попробуй. У меня на билдере получилось из одного приложения в другом кнопку надавить

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

HWND WinHandle , CtrHandle;
int id;

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

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

    //Пошлем сообщение о отм что ее нажали
    SendMessage(WinHandle , WM_COMMAND , (BN_CLICKED << 16) + id , (LONG)CtrHandle); 

Добавлено: 19 июн 2004, 14:06
maxrus
больше нечего сказать - SendMessage

Добавлено: 19 июн 2004, 20:16
Andy
больше нечего сказать - SendMessage
Черезчур оптимистично. Это конечно способ основной, но не всегда проходит. Если не сработает другой способ состоит в программном перемещении указателя на кнопку и вызова mouse_event() с MOUSEEVENTF_LEFTDOWN/MOUSEEVENTF_LEFTUP.

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

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

HWND WinHandle , CtrHandle; 
int id; 

    //WinHandle - хэндл диалогового окна 
    //CtrHandle - хэндл контрола (кнопки) 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    id = GetDlgCtrlID(CtrHandle);//Получим id кнопки !!!!!!!!!!!!!!!1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //Пошлем сообщение о отм что ее нажали 
    SendMessage(WinHandle , WM_COMMAND , (BN_CLICKED << 16) + id , (LONG)CtrHandle); 
И еще, Andy, можно чуть поподробнее про указатель. Кажется прийдется реализовать именно так!

Добавлено: 05 авг 2004, 19:23
Romeo
Чем SendMessage не устраивает?

Добавлено: 07 авг 2004, 15:24
arris
Romeo, все нормально, все работает!
Но как объяснишь, что после передачи окну сообщения оно не реагирует, пока не подвигаешь указатель мышки по окну. Я решил эту проблему чуть по другому: после передачи сообщения, вызывал закрытие окна - теперь все работает.
Не знаю, как была построены те окна, с которыми я работаю, но глючат они здорово! Приходится изощьряться разными способами!

Добавлено: 07 авг 2004, 16:56
AiK
arris, SetFocus пробовал?

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