Почему не появляется 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;
}
У вас криво организована оконная процедура. PostQuitMessage(1);
вызывается при обработке каждого не WM_CLOSE
сообщения. GetMessageA
прерывается как только доберется до первого из отправленных сообщений WM_QUIT
, но остальные продолжают лежать в очереди сообщений и прерывают цикл сообщений внутри MessageBoxA
заставляя ее сразу возвращаться. Добавьте флажок какой-нить хотя бы:
{
static bool posted{false};
if(not posted)
{
PostQuitMessage(1);
posted = true;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется файл inputtxt с таким содержимым: qwer qwe qwe qwerty
Мне нужно выполнить следующие арифметическое действие, компилятор думает, что это указатель, а не оператор умноженияcost и procent — имена переменных