16,472
社区成员
发帖
与我相关
我的任务
分享
关于《Windows编程启示录》中 8.15 一节:计时框改进版本的困惑
发现不仅计时消息框关闭了,主程序也结束了!
调试时发现TimedMessageBox中的PeekMessage调用失败,它并没有
成功的移除WM_QUIT,这是为什么呢?
我猜想的控制流是:WM_QUIT首先被发送给MessageBox中的模态消息循环,
后者处理了这个消息(销毁自己),并向所属线程的消息队列中重发了这个消
息,紧接着MessageBox返回,在TimedMessageBox中通过PeekMessage试图移除
这个消息(不知道为什么会失败?),然后对话框在模态消息循环中接收到了
WM_QUIT,从而程序结束…
我只是重复的写了 2 次 PeekMessage,一次是 0xc0df,一次是 0xc0ea
加多次数后,如下:
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);
这样才可以,依次获取的消息 ID 是:0xc0df,0xc0a,0xcodf,0x0012
使用 do{PeekMessage(&msg,0,0,0,1);}while(msg.message!=0x12) 自然也可以,不过
也只能限于这种情形的调试了