永发信息网

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

答案:2  悬赏:30  手机版
解决时间 2021-04-29 01:02

原来的代码

// 主消息循环:
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。

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

最佳答案
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.


全部回答
关闭窗体是WM_CLOSE,内部调用了WM_DESTORY来清理窗口
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
友情到底需要用什么来维持?
赚钱最快的方法是什么
泡泡堂SHOPPING达人 满送神龙乍现
怎么我QQ右键就掉
网上支付选什么好
我需要黑猫与牛奶的伴奏能帮我下么?
我姓周妻子姓危.我家宝贝儿子出生在09年11月2
我的qq 农场怎么不显示?
澡塘沟地址在哪,我要去那里办事
酷我K歌时怎么才能调出麦克风的声音啊 没有我
努力做好人的经典句子,想给一个人做好朋友,
一首只有哼唱 的歌曲 纯音乐 无歌词 一直是 W
高压锅可以煮稀饭吗?
鸭子和鸡的区别在哪?难道因为一个在水里,一
一共有多少种职业?能不能给我讲讲啊?
推荐资讯
华润超市怎么去啊,有知道地址的么
windows7下载哪个版本比较好·
南北水果批发地址在哪,我要去那里办事
qq农场播种时间表格
我QQ出了问题
过年到底该不该去?
赫顿玛尔贵族套装上衣多少钱
我上个月是三十一号来月经,这个月都三号了,
电脑总是玩着玩着就死机一样 黑屏了 很像没电
在北京哪里可以买到《爵迹》限量版
【有时候,往往不知道什么对、什么错】
冠之霖手机旗舰店南旺店在什么地方啊,我要过
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?