永发信息网

while (GetMessage(&msg, NULL, 0, 0))如何接收WM_QUIT

答案:2  悬赏:30  手机版
解决时间 2021-04-29 01:02
  • 提问者网友:欲望失宠
  • 2021-04-28 05:39

原来的代码

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

这个是能正常关闭的


但我加了个循环后,其它没变动:

while (GetMessage(&msg, NULL, 0, 0))
{
while( msg.message != WM_QUIT )
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
tNow = GetTickCount();
if(tNow-tPre >= 20)
MyPaint(hdc);

}

}

}

while (GetMessage(&msg, NULL, 0, 0))貌似没法检测到 WM_QUIT ,点右上角叉叉关闭只能关掉窗口,调试并没停止,只能强行shift+F5。

请问怎么让改能让其正常关闭

最佳答案
  • 五星知识达人网友:荒野風
  • 2021-04-28 07:02
WM_QUIT以后GetMessage就返回0了,直接跳出while
你应该检测WM_DESTROY或者WM_CLOSE,根据你的需要应该是检测WM_DESTROY

点小叉叉所引发的消息链是这样的:
点叉叉,收到一个WM_CLOSE消息,一般这个消息自己不处理,所以送入DefWindowProc,默认的WM_CLOSE处理是送出一个WM_DESTROY消息,然后你收到,这个时候的一般处理是PostQuitMessage,送出一个WM_QUIT消息,GetMessage收到WM_QUIT就返回0,所以while就直接结束了,接下来的逻辑无法完成。

这是MSDN上对GetMessage返回值的解释:

Return Value

If the function retrieves a message other than WM_QUIT, the return value is nonzero.

If the function retrieves the WM_QUIT message, the return value is zero.

If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer. To get extended error information, call GetLastError.


全部回答
  • 1楼网友:蓝房子
  • 2021-04-28 08:32
关闭窗体是WM_CLOSE,内部调用了WM_DESTORY来清理窗口
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯