[idd] helper: correctly pump message and destroy window

This commit is contained in:
Quantum
2025-09-13 20:57:49 -04:00
committed by Geoffrey McRae
parent 67e1574d20
commit 5c1d604a22
3 changed files with 33 additions and 8 deletions

View File

@@ -60,6 +60,9 @@ LRESULT CWindow::handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_CREATE:
onCreate();
return 0;
case WM_NCDESTROY:
PostQuitMessage(0);
return 0;
default:
if (s_taskbarCreated && uMsg == s_taskbarCreated)
{
@@ -89,8 +92,18 @@ void CWindow::registerIcon()
DEBUG_ERROR_HR(GetLastError(), "Shell_NotifyIcon(NIM_ADD)");
}
CWindow::~CWindow()
void CWindow::destroy()
{
if (m_hwnd)
{
DestroyWindow(m_hwnd);
m_hwnd = NULL;
}
}
CWindow::~CWindow()
{
destroy();
}

View File

@@ -21,6 +21,7 @@ public:
static bool registerClass();
CWindow();
~CWindow();
void destroy();
HWND hwnd() { return m_hwnd; }
};

View File

@@ -84,21 +84,31 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
CWindow window;
bool running = g_pipe.Init();
while (running)
if (!g_pipe.Init())
{
switch (MsgWaitForMultipleObjects(1, l_exitEvent.GetAddressOf(),
window.destroy();
l_exitEvent.Close();
}
while (true)
{
switch (MsgWaitForMultipleObjects(
l_exitEvent.IsValid() ? 1 : 0,
l_exitEvent.GetAddressOf(),
FALSE, INFINITE, QS_ALLINPUT))
{
case WAIT_OBJECT_0:
running = false;
window.destroy();
l_exitEvent.Close();
break;
case WAIT_OBJECT_0 + 1:
{
MSG msg;
if (GetMessage(&msg, NULL, 0, 0))
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
goto exit;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
@@ -107,10 +117,11 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
case WAIT_FAILED:
DEBUG_ERROR_HR(GetLastError(), "MsgWaitForMultipleObjects Failed");
running = false;
break;
goto exit;
}
}
exit:
g_pipe.DeInit();
return EXIT_SUCCESS;