有人说:(这是错的!) 这是死循环,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消息,因为这样会造成程序的收尾工作无法进行,正常退出后所需要的资源释放等操作就没法执行了。】 |
|