Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Закрытие выскакивающих окон


Автор: steven13 31.3.2005, 16:50
Есть проблема, постоянно выскакивает окно, и там нужно нажать кнопку ОК.
В ручную конкретно надоело.

Сделал

Код

    HWND hWnd1 = ::FindWindow(NULL, _T("ПРЕДУПРЕЖДЕНИЕ"));
    if (IsWindow(hWnd1))
    {
        ::SendMessage(hWnd1, WM_CLOSE, NULL, NULL);
    };


Но она закрывает программу а но не нажимает на кнопку ОК.
Проблема в том что если назать на НЕТ или Закрыть окно, то програма перестаёт работать!

Думал так будет:
Код

        ::SendMessage(hWnd1, WM_OK, NULL, NULL);


Но пишет WM_OK - не задекларировано.

Кнопка "ОК" стоит как "First child windows"
Как на неё можно нажать?

Сейчас нажимаю мышкой по точному адресу на экране. Но это непреемлемый вариант.






Автор: _hunter 31.3.2005, 17:08
и правильно говорит. нет такого сообщения. кнопке можно посылать WM_LBUTTONDOWN
+ ты неправильно окно ищеш ( кнопка -- это дочернее окно ) сначала находи родительское, а уже потом в нем ищи кнопку ( EnumChildWindows() )

Автор: jorkug 1.4.2005, 14:27
Код

char temp_buffer[2];

BOOL CALLBACK EnumChildWnd(

    HWND hwnd,
    LPARAM lParam
   )
{
                SendMessage(hwnd, WM_GETTEXT, 2, temp_buffer);
                if(!strcmp(temp_buffer, "OK"))
                  SendMessage(hwnd, WM_LBUTTONDOWN, 1, 1);
    return TRUE;
}

и:
Код

HWND hWnd = FindWindow(NULL, _T("ПРЕДУПРЕЖДЕНИЕ"));
EnumChildWindows(hWnd,&EnumChildWnd,0);

Автор: steven13 1.4.2005, 18:17
hunter
Спасибо, я понял что нужно копать глубже.
Но как работает EnumChildWindows() - догнать пока немогу.

jorkug

SendMessageA' : cannot convert parameter 4 from 'char [2]' to 'LPARAM'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast


Автор: _hunter 1.4.2005, 18:28
передаеш в эту функцию указатель на другую функцию, в которую будут передаваться все дочерние окна.

попробуй текст не скопипастить, а вручную написать ( или покажи этот кусок ). потому как должно работать...

Автор: steven13 1.4.2005, 19:07
Вот робочий вариант:

Код

char temp_buffer[1];
BOOL CALLBACK EnumChildWnd(

    HWND hwnd,
    LPARAM lParam
   )
{
                SendMessage(hwnd, WM_GETTEXT, 2, (int)temp_buffer);
                if(!strcmp(temp_buffer, "Т")) 
                {

                  SendMessage(hwnd, WM_LBUTTONDOWN, 1, 1);
                  SendMessage(hwnd, WM_LBUTTONUP, 1, 1);

//Что здесь написать, что-бы прекратить ещё искать окна?

                 }

    return TRUE;
}

Автор: _hunter 1.4.2005, 19:19
читаем справку:
To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
соответственно пишем return FALSE;

Автор: steven13 2.4.2005, 04:14
Первая часть:

Код

HWND HwndChild=NULL;
HWND hWndZapros=NULL; 


BOOL CALLBACK EnumChildWnd (HWND hwnd, LPARAM lParam)
{
    HwndChild=hwnd;
    return FALSE; //Так как нужная мне кнопка первая, никакие проверки не нужны.
}



Вторая часть:
Код

    hWndZapros=NULL;
        while(!hWndZapros)   
        {        
            hWndZapros = ::FindWindow(NULL, _T("Предупреждение"));
        //Ждёт пока появится окно с Предупреждением.
        }

        EnumChildWindows(hWndZapros,&EnumChildWnd,0);
        //Находит кнопку

        ::SendMessage(HwndChild, BM_CLICK, 1, 1);
        //Нажимает на кнопку [b]ОК[/b].


После нажатия на кнопку ОК, открывается ещё одно МОДАЛЬНОЕ окно, smile
где перреспрашивают, "Вы действительно уверены?". smile

Но програма дальше ничего не обрабатывает, а ждёт пока я закрою это окно. smile

Как мне нажать ещё на этом окне "ОК"?

ЗЫ: Пока сделал две отдельные програмы, которые закрываю каждая своё окно. Но это изврат какой-то получается...


Автор: steven13 2.4.2005, 16:22
http://forum.vingrad.ru/index.php?showtopic=39465


Цитата(p0s0l @ 14.1.2005, 22:10)
Цитата(Alexandr87 @ 11.1.2005, )
После чего, программа останавливается на втором сообщении, и следует дальше только после закрытия приложения с окном содержащим сий контрол.
А сам-то клик всё-таки срабатывает или нет ? Т.е. открывается новое окно ?
Если да, то попробуй вместо SendMessage делать PostMessage.
Отличие в том, что PostMessage добавляет сообщение в очередь, а SendMessage - передаёт сообщение сразу же на обработку оконной процедуре, и ждёт пока та не обработает сообщение...



Помогло!!!

Автор: jorkug 2.4.2005, 16:25
Если не ошибаюсь, это окно является Child'oм первого. Появляется оно почти мгновенно, так что можно поставить задержку и закрыть его тем же способом.

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