Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > пРОГРАММНО НАЖАТЬ КНОПКУ!


Автор: Puoar 27.11.2007, 05:46
Можно ли программно нажать произволную кнопку на окне, а так-же нажать ее вообще не выводя окно на экран. Короче как запустить некий установщик имеющий диалоги, но их не показывать и на все задаваемые в диалогах вопросы овечать "да" ну или "нет" по моему усмотрению?

Автор: dumb 27.11.2007, 05:52
практически все установщики имеют silent режим(обычно опции -s -q), в котором инсталляция проходит без вопросов.

Автор: Puoar 27.11.2007, 07:12
Цитата(dumb @  27.11.2007,  05:52 Найти цитируемый пост)
практически все установщики имеют silent режим
 Но не все ( . И все же как можно добиться такого самому... 

Автор: AndreyK 28.11.2007, 20:35
Нажать кнопку просто - послать ей сообщение WM_COMMAND (функцией SendMessage).

Или ,если у всего диалога есть обработка клавиши Enter (действия по умолчанию),  послать (всему диалогу) сообщение о нажатии Enter.
Для этого ,кажеться, надо послать несколько сообщений - нажатия, отжатия ... в общем можно подсмотреть в обработчике сообщений любой программы.
Хотя щас инсталляторы предлагают ответить : "Вы согласны с лицензионным соглашением?" а без этого ответа "по умолчанию" не пройдёшь.

Автор: alias_trinity 11.12.2007, 13:17
1. Найди дескриптор кнопочки :   hButton = GetDlgItem(hWnd, ID_BUTTON);
2. Пошли сообщение BM_CLICK : SendMessage(hButton, BM_CLICK, 0, 0);

Или просто SendDlgItemMessage(hWnd, ID_BUTTON, BM_CLICK, 0, 0);

Сам диалог просто сделай ShowWindow(hWnd, 0);

Автор: Earnest 11.12.2007, 20:35
Цитата(alias_trinity @  11.12.2007,  14:17 Найти цитируемый пост)
SendMessage(hButton, BM_CLICK, 0, 0);

Просто жуть, что советуешь... в MSDN бы заглянул... нет такого сообщения...

Должно быть WM_COMMAND, с wParam = идентификатор кнопки, lParam - 0. Хотя это не гарантирует, что кнопка будит правильно обработана, т.к. такой формат у команды меню - мало ли что этот диалог себе думает, может и проверить... От реального нажатия кнопки придет команда с wParam = MAKEWORD (btnID, BN_CLICKED) и lParam = hWndBtn. Так и надо делать для гарантии.
Только это не нажатие кнопки будет визуальное), а прямая посылка этой команды. Если хочешь именно нажатие, вызывай mouse_event, определив экранные координаты нужной кнопки.

Диалог на экран не выводить не получиться - если нет silent-режима - не ты же этим управляешь. Можно его, конечно, и спрятать, но мелькать все равно будет.

Но основная проблема - определить, когда очередное окно готово к нажатию кнопки... И какую из имеющихся кнопок нужно жать... Если знаешь, как сделать это, то нажать-то... 

Автор: alias_trinity 12.12.2007, 16:20
Цитата

Просто жуть, что советуешь... в MSDN бы заглянул... нет такого сообщения...



А ты утруди себя и скомпиль вот этот код :
Код

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
{
    HWND hButton = FindWindow("Shell_TrayWnd",NULL);
    hButton = GetWindow(hButton,GW_CHILD);
    SendMessage(hButton,BM_CLICK,0,0);
    return 0;
}


Про результаты напишеш... smile 

Автор: Earnest 12.12.2007, 19:08
Да, ты прав, это мне надо было сначала посмотреть в MSDN.  smile 
Не знала про это сообщение - теперь буду, может и пригодится когда.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)