尽管我的窗口过程函数能够检测到WM_CLOSE
消息,并且调用PostQuitMessage
并让Windows继续使用来处理窗口消息,但是我有一个窗口在创建后无法立即关闭DefWindowProc
。
但是,通过拖动标题栏移动窗口后,它似乎可以正常关闭。
我的窗口过程函数的代码如下:
LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUIT:
{
printf("WM_QUIT\n");
break;
}
case WM_CLOSE:
{
printf("WM_CLOSE\n");
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(handle, message, wParam, lParam);
}
因此,除了将WM_MOVE
消息发送到我的窗口或exit(0)
在WM_CLOSE
case块中使用外,如何确保在创建窗口后可以立即将其关闭?
传递NULL
到的hWnd
参数后GetMessageW
,而不是我的窗口句柄后,窗口现在正确关闭,因此回答了我之前的问题。
因此,为什么GetMessageW
函数以前没有WM_QUIT
使用提供的唯一窗口句柄来检索消息,而不是将其NULL
用作hWnd
参数?
一个适当的书面消息循环永远不会派遣一个WM_QUIT
消息窗口过程中,什么时候会简单地打破循环GetMessage()
返回0,它收到时WM_QUIT
消息:
如果函数检索到WM_QUIT以外的消息,则返回值为非零。
如果该函数检索WM_QUIT消息,则返回值为零。
如果有错误,则返回值为-1。例如,如果hWnd是无效的窗口句柄或lpMsg是无效的指针,则该函数将失败。要获取扩展的错误信息,请调用GetLastError。
作为对的响应WM_CLOSE
,您应该打电话DestroyWindow()
而不是PostQuitMessage()
直接打电话(的默认行为DefWindowProc(WM_CLOSE)
是DestroyWindow()
为您打电话)。您需要一个WM_DESTROY
处理程序,然后应调用PostQuitMessage()
:
LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
{
printf("WM_CLOSE\n");
DestroyWindow(handle);
return 0;
}
case WM_DESTROY:
{
printf("WM_DESTROY\n");
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(handle, message, wParam, lParam);
}
这记录在MSDN上:
这是该页面的流程图:
对于此GetMessage()
问题,如果您仔细阅读文档GetMessage()
并PostQuitMessage()
仔细阅读,将会看到WM_QUIT
张贴的消息PostQuitMessage()
不是窗口消息。传递非NULLHWND
到GetMessage()
只会从中检索消息PostMessage()
,SendMessage()
该消息是针对该特定消息HWND
1的。GetMessage()
将会忽略任何非预期的消息HWND
,其中包括来自和的线程消息。传递一个NULL来允许它返回任何未决的消息,其中包括。PostThreadMessage()
PostQuitMessage()
HWND
GetMessage()
WM_QUIT
1这样做很危险,顺便说一句:过滤窗口消息的危险
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句