Почему не выводится MessageBox?

129
11 марта 2022, 12:10

Почему не появляется MessageBox перед закрытием программы - после завершения оконной процедуры и соблюдения условия его вызова? А появляется только если его вызвать до PostQuitMessage.

#include <windows.h>
//#include <cstdio>
long __stdcall WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (uMsg == WM_CLOSE)
        PostQuitMessage(0);
    else if (!FindWindowExA(nullptr,nullptr,"TargetAppClass",nullptr))
        PostQuitMessage(1);
    return DefWindowProcA(hWnd, uMsg, wParam, lParam);
}
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {
    (void) hPrevInstance;
    (void) lpCmdLine;
    (void) nCmdShow;
    WNDCLASSEXA WinClass;
    memset(&WinClass,0,sizeof(WNDCLASSEXA));
    WinClass.cbSize = sizeof(WNDCLASSEXA);
    WinClass.hInstance = hInstance;
    WinClass.lpfnWndProc = WindowProc;
    WinClass.lpszClassName = "MonitoringApp";
    CreateMutexA(NULL, TRUE, WinClass.lpszClassName);
    if (ERROR_ALREADY_EXISTS == GetLastError()) return ERROR_ALREADY_EXISTS;
    RegisterClassExA(&WinClass);
    auto win = CreateWindowExA(0,WinClass.lpszClassName,WinClass.lpszClassName,0,0,0,0,0,nullptr,nullptr,WinClass.hInstance,nullptr);
    MSG msg;
    while(GetMessageA(&msg,win,0,0)) {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }
//    printf("%u, %u\n",msg.message,msg.wParam); // показывает 18, 1 (WM_QUIT и код выхода)
    if (msg.wParam) // MessageBox не выводится. Почему?
        MessageBoxA(nullptr, "Seems that the TargetApp crashed", "Monitoring App", MB_ICONWARNING | MB_OK | MB_SYSTEMMODAL);
    return 0;
}
Answer 1

У вас криво организована оконная процедура. PostQuitMessage(1); вызывается при обработке каждого не WM_CLOSE сообщения. GetMessageA прерывается как только доберется до первого из отправленных сообщений WM_QUIT, но остальные продолжают лежать в очереди сообщений и прерывают цикл сообщений внутри MessageBoxA заставляя ее сразу возвращаться. Добавьте флажок какой-нить хотя бы:

{
    static bool posted{false};
    if(not posted)
    {
        PostQuitMessage(1);
        posted = true;
    }
}
READ ALSO
В файле дописать к каждому слову текст

В файле дописать к каждому слову текст

Имеется файл inputtxt с таким содержимым: qwer qwe qwe qwerty

248
Удаление элементов из vector_pair

Удаление элементов из vector_pair

Я хочу удалить элементы v[i+1]first и v[i+1]

103
c++ гигантский массив

c++ гигантский массив

Как на с++ сделать матрицу размером 10^5, у меня получается но только 10^4

84
Как умножать между собой переменные?

Как умножать между собой переменные?

Мне нужно выполнить следующие арифметическое действие, компилятор думает, что это указатель, а не оператор умноженияcost и procent — имена переменных

118