PostQuitMessage()和DestroyWindow()之间的逻辑区别是什么?

rai*_*nce 14 c++ windows winapi

在我的演示有点应用程序

case WM_CLOSE:
    DestroyWindow(hndl);
    return 0;
Run Code Online (Sandbox Code Playgroud)

case WM_CLOSE:
    PostQuitMessage(0);
    return 0;
Run Code Online (Sandbox Code Playgroud)

照着做.在给每个人打电话时窗帘背后有什么不同?DestroyWindow更直接,PostQuitMessage必须通过getmessage循环返回false吗?

chr*_*ris 16

DestroyWindow销毁窗口(惊喜)并向消息队列发布WM_DESTROY(你也会得到一个WM_NCDESTROY).这是默认行为WM_CLOSE.但是,仅仅因为窗口被销毁并不意味着消息循环应该结束.这可以是具有在关闭时结束应用程序的特定窗口以及在关闭时对应用程序不执行任何操作的其他窗口(例如,选项页面)的情况.

PostQuitMessage将a发布WM_QUIT到消息队列,经常导致消息循环结束.例如,GetMessage当它拉出时将返回0 WM_QUIT.这通常会在WM_DESTROY主窗口的处理程序中调用.这不是默认行为; 你必须自己做.


Han*_*ant 14

片段都不正确.第一个将执行默认窗口过程在处理WM_CLOSE消息时已经执行的操作,因此是多余的.但是不会让应用程序退出,它应该继续运行,你通常必须通过Debug + Stop Debugging强制调试器停止.如果你在没有调试器的情况下运行它,那么你将保持进程运行但没有窗口,所以你不能告诉它仍在运行.使用Taskmgr.exe,Processes选项卡查看这些僵尸进程.

第二个代码段将终止应用程序,但由于您未将WM_CLOSE消息传递给默认窗口过程,因此无法正常清理.窗户不会被破坏.虽然操作系统会为你清理所以它确实都会有一个好的结局,只是没有任何优点的奖励点.

正确的方法是在主窗口被销毁时退出.您将从发生这种情况时发送的WM_DESTROY通知中了解它:

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
Run Code Online (Sandbox Code Playgroud)

  • 不,任何窗口都会在销毁时发送WM_DESTROY.Windows本身对窗口没有特别的偏好,对于没有窗口的应用程序也没有问题.因此,您需要对发送该消息的*specific*窗口感兴趣.如果它是你的主窗口被破坏而没有留下,那么你应该退出你的程序,因为用户不能再做任何有用的事了.当你获得该窗口的WM_DESTROY时,通过调用PostQuitMessage来执行此操作. (3认同)