我试图在win32中编写hello world但是当我关闭主窗口时,应用程序继续运行
我的窗口程序:
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wparam, lparam);
}
事件循环:
while ((bret = GetMessage(&msg, hWndMain, 0, 0) != 0)
{
if (bret == -1)
{
DWORD error = GetLastError();
return 1;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
现在,通过单击右上角x得到WM_DESTROY,而不是GetMessage()返回0表示获取WM_QUIT,而是返回-1而GetLastError()发出错误1400,这是“无效”窗把手“ ......我很困惑。
答案 0 :(得分:10)
通常你会传递NULL而不是GetMessage()
的窗口句柄,这可以解释为什么你得到ERROR_INVALID_WINDOW_HANDLE
,因为在WM_DESTROY
和朋友完成后,窗口将不再存在。由PostQuitMessage()
发布的WM_QUIT是一个线程消息,因此具有句柄的GetMessage永远不会接收它。
这是一个实现细节,但PostQuitMessage甚至不发布真实消息,它只是一个由线程存储的标志,GetMessage将在需要时自动生成消息,有关详细信息,请参阅this blog post。
答案 1 :(得分:0)
我个人这样做:
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}