WM_CLOSE WM_DESTROY WM_QUIT 区别

在发送 WM_QUIT消息时,要使用PostMessage发送,否则,窗口已经关闭,但任务管理器中进程还存在。

可以通过 pDlg->PostMessage(WM_QUIT);或

DWORD dwThreadId = GetWindowThreadProcessId(pDlg->GetSafeHwnd(),NULL);
PostThreadMessage(dwThreadId,WM_QUIT,0,0);

结束进程。

WM_DESTROY消息有点儿不同。它是窗口正在关闭时发出的。
当得到WM_DESTROY消息的时候,窗口已经从视觉上被删除。

 一个主窗口被关闭,并不意味着应用程序结束了,它将在没有窗口的条件下继续运行。
然而,当一个用户关闭了主窗口,也就意味着他要结束应用程序,所以如果你希望应用程序结束,在收到WM_DESTROY消息的时候,你必须发出一个WM_QUIT消息。
WM_QUIT是应用程序结束发出的消息,一般可以看成进程被kill掉的情况.
 
PostQuitMessage是向系统发出要终止线程的请求, 在终止线程前系统还要做些内存的清理工作, 我们关闭一个程序时是发送WM_CLOSE消息, 然后调用DestroyWindow函数,调用DestroyWindow时系统会向程序发WM_DESTROY消息,终止整个程序
用自己的话总结一下:WM_CLOSE 消息发出的时候,用户可以根据自己的意愿来选择到底是否关闭,WM_DESTORY 是真的关闭一个窗口。WM_QUIT是退出一个应用程序。

 

以下转自:http://hhfighting.blog.163.com/blog/static/5570032320108215323797/

WM_CLOSE:关闭应用程序窗口
WM_DESTROY:关闭应用程序
WM_QUIT:关闭消息循环
只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。
win32应用程序的完整退出过程:点击窗口右上角的关闭按钮,发送WM_CLOSE消息。此消息处理中调用DestroyWindow函数,发送WM_DESTROY消息。此消息处理中调用PostQuitMessage(0)函数,发送WM_QUIT消息到消息队列中。GetMessage捕获到WM_QUIT,返回0,退出循环(应用程序真正退出)。
tips:按照上述正常流程,WM_QUIT是不会到达窗口过程的。(因为在GetMessage截获了WM_QUIT消息之后,程序已经彻底退出了!)
MFC应用程序的完整退出过程:点击窗口右上角的关闭按钮,或 选择【File/Close】,发出 WM_CLOSE消息。CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式。预设函数对于WM_CLOSE 的处理方式是呼叫 ::DestroyWindow, 并因而发出WM_DESTROY。预设之WM_DESTROY 处理方式是呼叫::PostQuitMessage,因此发出WM_QUIT。CWinApp::Run 收到WM_QUIT 后会结束其内部之讯息回路, 然后呼叫ExitInstance,这是CWinApp 的?个虚拟函数。如果自己应用程序累CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所呼叫的就是CMyWinApp::ExitInstance,否则就是 CWinApp::ExitInstance。最后回到 AfxWinMain,执行 AfxWinTerm,结束程序。
附加:当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。
WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息.
相关代码分析:
//主函数中进入消息循环的代码片断
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //将消息进行处理一下
DispatchMessage(&msg); //再将消息变量msg传给windows,让windows来调用消息处理函数
}
如果把GetMessage(&msg,NULL,0,0)改为GetMessage(&msg,hWnd,0,0),则发现关闭应用程序后,任务管理器中仍有该程序的进程,且占用大量的内存,why?
msdn中的原因解释;对于GetMessage(&msg,hWnd,0,0),当第二个参数无效时,此函数返回值为-1。对于上述循环来说,此while条件为真,因此进入死循环,进程无法退出。
在Windows编程中,特别是使用Win32 API进行窗口程序设计时,应用程序的消息循环会处理各种消息,其中WM_CLOSEWM_DESTROYWM_QUIT是与窗口关闭相关的消息。它们出现的顺序通常如下: 1. WM_CLOSE消息是在用户尝试关闭窗口时产生的,例如通过点击窗口的关闭按钮。应用程序可以通过处理WM_CLOSE消息来询问用户是否真的要关闭窗口,并执行必要的清理工作。在调用DestroyWindow函数后,系统会发送WM_CLOSE消息。 2. WM_DESTROY消息是在窗口即将被销毁之前发送的。当窗口接收到WM_CLOSE消息并且调用DestroyWindow后,窗口会被销毁。此时,窗口的父窗口(如果有的话)会收到WM_DESTROY消息。 3. WM_QUIT消息是在程序调用PostQuitMessage时产生的,这通常发生在处理WM_DESTROY消息的最后。WM_QUIT消息会导致消息循环退出,从而结束应用程序。 为了验证这三个消息出现的顺序,可以在Win32应用程序的消息处理函数中添加相应的代码来记录这三个消息的接收顺序。示例如下: ```c LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: // 在这里添加代码以验证WM_CLOSE消息 // 例如:记录日志或者设置一个标志 break; case WM_DESTROY: // 在这里添加代码以验证WM_DESTROY消息 // 例如:记录日志或者设置一个标志 break; case WM_QUIT: // 在这里添加代码以验证WM_QUIT消息 // 例如:记录日志或者设置一个标志 break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } ``` 在上面的代码中,你需要用一些机制(如全局变量或者日志记录)来记录这三个消息的处理顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值