分享

SendMessage(hwnd,WM_QUIT,0,0); 为啥不好使

 君王之王 2015-05-18
有人说:(这是错的!)
这是死循环,SendMessage(hwnd,WM_QUIT,0,0);
在消息队列中阻塞,后面的消息就都不会执行,而你阻塞的条件就是后面的消息执行完
其实:(对的!)
根本不是阻塞,
这个在SendMessage语句之后设个断点调试一下就知道了。
GetMessage只在有队列消息时返回,WM_QUIT会使其返回0,一般消息循环都是在GetMessage返回0时结束
PostMessage产生队列消息,
SendMessage产生非队列消息,
因此SendMessage发的WM_QUIT不会使消息循环结束以WM_QUITE为参数的SendMessage,只是调用以WM_QUITE为参数的WndProc而已。
而你的WndProc没有对WM_QUITE消息进行处理,而是调用了DefWindowProc。
而DefWindowProc中对WM_QUITE消息是没有默认的处理的。
要让进程结束,就得用ExitProcess或TerminateProcess,可以自己显示调用,
也可以让WinMain函数返回后,由运行库来调用。
要让WinMain函数返回,就得让while循环结束。
要让while结束的条件,就得让GetMessage返回0.
要让GetMessage返回0,线程消息队列就必须设置了QS_QUIT状态标记,或者有WM_QUIT消息。
而设置QS_QUIT标记,可由PostQuitMessage来完成,
WM_QUIT可由PostMessage来完成。
【按 使用PostQuitMessage()与PostMessage()的不同是:
前者把消息列队里的QS_QUIT标志打开,并且等待程序处理完消息列队里的所有消息后才结束消息循环。
后者是把WM_QUIT直接放到消息列队,消息循环取到得下一个消息是WM_QUIT就立即退出。MSDN里不建议使用PostMessage发送WM_QUIT消息,因为这样会造成程序的收尾工作无法进行,正常退出后所需要的资源释放等操作就没法执行了。】

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多