//=====================================================================
//TITLE:
// PostQuitMessage和PeekMessage的诡异行径
//AUTHOR:
// norains
//DATE:
// Monday 8- March-2010
//Environment:
// WINDOWS CE 5.0
// WINDOWS XP
//=====================================================================
在将程序从WinCE移植到WinXP中,发现之前移植运行得正常的程序,居然无法退出了。经过排查,发现问题出在这段代码:
消息循环的代码也很简单:
代码意思很简单,如果是CMD_EXIT命令的话,就直接发送PostQuitMessage消息,退出消息循环。而调用PeekMessage的目的也非常简单,就是去掉鼠标左键消息。因为在处理第一次鼠标按键的过程中,可能用户还在不停地点击相同的按钮,从而导致同一个按钮的不停的滞后响应。
这段代码结构在WinCE5.0下是没有任何问题的,一切跑得非常正常顺畅。但如果是在WinXP下,就迥然不同了--GetMessage看起来根本就没有接收到WM_QUIT消息!
说无法接收其实也不完全对,如果你在PostQuitMessage这行代码设置断点,停在断点时,然后再按F5让其继续全速奔跑,那么程序又能正常退出了。
是不是很诡异?那时候PeekMessage没调用,只是在PostQuitMessage这里暂停了一下,就一切正常了。
最后真正的原因我也没有找到,因为我也没有WinXP的内核代码。但根据过往的经验推测,这个应该是多线程的原因。很可能是WinCE和WinXP在消息处理模型不一样的缘故。WinCE可能为了节约资源,消息是一个一个进行处理;而WinXP不同部分的消息,可能是分为多个线程来进行处理。
以我们的代码进行推测,当正常运行时,在我们调用PostQuitMessage后,WM_QUIT还没有进入准备的消息队列。而调用PeekMessge去除鼠标左键消息的时候,同时也将WM_QUIT从队列中移除。
而在PostQuitMessage设置断点的情况可能有点不同。跑过这句后,可能WM_QUIT已经进入了准备的消息队列,所以之后的结果就如我们之前所预想的。
不过,这也只是我的推测,究竟实际是否如此,还望大家指教。
分享到:
相关推荐
PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx ...
一个简单的绘图板win32程序 #include "windows.h" HINSTANCE hinst=NULL; HWND btn_close,btn_line,btn_rect,btn_ell,btn_cpen,btn_cbrush,btn_label; HDC hDC,hDC_lable;... PostQuitMessage(0); }
PostQuitMessage 0 ; } else { 调用函数指针创建子类对象 ctrl CGameCtrl::pfun create ; 设置句柄 ctrl >SetHandle hwnd hIns ; 游戏的初始化 ctrl >OnCreateGame ; } ...
VC WinExample和MFCExample程序演示,是创建此两类程序的演示,一种是使用WINAPI的方式 创建程序窗口,另一种是采用MFC方式创建窗口,下面列举一上结使用WINAPI方式创建窗口的具体代码,完整代码请下载本源码。...
毕业设计图书销售管理系统//如果数据源存在则连接数据库 try{m_Database.OpenEx ("DSN=book",0);} catch(...) ... try{LoadDbSource ("book",path+"db\\book.mdb");... PostQuitMessage(0); } }
PostQuitMessage 0 ; TODO: 在此处添加消息处理程序代码 } 另外默认的Ok Cancel按钮换成 void CMyDlg::OnBnClickedOk { TODO: 在此添加控件通知处理程序代码 OnOK ; this >DestroyWindow ; } void ...
第十三节 消息和消息总队列函数(Message and Message Queue) 165 BroadcastSystemMessage 165 DispatchMessage 166 GetlnputState 167 GetMessage 167 GetMessageExtralnfo 168 GetMessagePos 168 GetMessageTime ...
易语言f_in_box封装演示源码,f_in_box封装演示,WinFroc,GetSystemMetrics,SetCapture,ReleaseCapture,CreateMenu,AppendMenu,TrackPopupMenu,PostQuitMessage
Post WM_QUIT 时,应使用 PostQuitMessage 代替。 4、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己做整编。 用 PostMessage、...
凭空创建窗口,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,DispatchMessage,GetMessage,TranslateMessage,LoadCursor,LoadIcon,PostQuitMessage
易语言载入窗口模态源码,载入窗口模态,载入_模态,DialogProc,GetMessageA,PeekMessageA,TranslateMessage,DispatchMessageA,PostQuitMessage,TranslateAcceleratorA,EnableWindow,SetForegroundWindow,...
易语言API创建窗口源码,API创建窗口,创建窗口,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,DispatchMessage,GetMessage,TranslateMessage,...PostQuitMessage
甩动窗口,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,DispatchMessage,GetMessage,TranslateMessage,LoadCursor,LoadIcon,PostQuitMessage,GetMenu,...
易语言Hello Window源码,Hello Window,WndProc,WinMain,PlaySound,BeginPaint,GetClientRect,DrawText,EndPaint,PostQuitMessage,DefWindowProc,LoadIcon,LoadCursor,GetStockObject,RegisterClass,CreateWindow,...
易语言凭空创建窗口并响应窗口消息源码,凭空创建窗口并响应窗口消息,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,...LoadCursor,LoadIcon,PostQuitMessage
易语言仿PhotoShop浮动工具栏源码,仿PhotoShop浮动工具栏,WindowProc,消息循环,RegisterClass,UnregisterClass,CreateWindowEx,UpdateWindow,ShowWindow,GetClientRect,ClientToScreen,...PostQuitMessage,DefWindo
易语言窗口消息机制源码,窗口消息机制,窗口主程序,窗口回调函数,GetModuleHandle,GetCommandLine,LoadIcon,LoadCursor,RegisterClassEx,CreateWindowEx,ShowWindow,UpdateWindow,...PostQuitMessage,DefWindowProc,
易语言使用sdk方式创建窗口源码,使用sdk方式创建窗口,窗口主程序,窗口回调函数,GetModuleHandle,GetCommandLine,LoadIcon,LoadCursor,RegisterClassEx,CreateWindowEx,ShowWindow,...DispatchMessage,PostQuitMessage,
易语言彗星载入线程窗口模块源码,彗星载入线程窗口模块,彗星载入线程窗口,彗星销毁线程窗口,窗口线程,OnMessage,消息循环,CreateThread,GetMessage,DispatchMessage,TranslateMessage,PostQuitMessage,...
易语言智能换肤模块1.2源码,智能换肤模块1.2,WndProc,WinMain,主窗口创建完毕,帮助按钮被点击,菜单按钮被点击,PlaySound,BeginPaint,GetClientRect,DrawText,EndPaint,PostQuitMessage,DefWindowProc,LoadIcon,...