WM_CLOSE、WM_DESTROY、WM_QUIT, SENDMESSAGE ,POSTMESSAGE
1、发送消息SendMessage、PostMessage
PostMessage将消息放入消息队列后马上返回,而SendMessage直到窗口过程处理完消息后才返回
2、三个消息的区别
WM_CLOSE:
在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对 WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等。如果用户选择“取消”,你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。
WM_DESTROY:
接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),然后调用PostQuitMessage。
WM_QUIT:
PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。
假设使用者执行HELLOWIN,并且使用者最终单击了 Close按钮,或者假设用键盘或鼠标从系统菜单中选择了 Close, DefWindowProc处理这一键盘或者鼠标输入,在检测到使用者选择了Close选项之后,它给窗口消息处理程序发送一条WM_SYSCOMMAND消息。WndProc将这个消息传给DefWindowProc。 DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。 DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入消息队列中,以此来响应此消息。这个消息导致WinMain中的消息循环终止,然后程序结束。
3、退出程序语句
exit(0);
postquitmessage(0);
onok();oncancel();
sendmessage(wm_close,0,0);
exitprocess(0);
其中以exit(0)最为迅速,在实践方面
Ps:
原文:SendMessage sends the specified message to a window or windows. SendMessage calls the window procedure for the specified window and does not return until the window procedure has processed the message. The PostMessage function, in contrast, posts a message to a thread's message queue and returns immediately.
译文:SendMessage将指定的消息发送到一个窗口或多个窗口。SendMessage为这个指定的消息调用窗口处理程序,直到窗口处理完这个程序后才会返回。和SendMessage函数相比,PostMessage函数发送一个消息到线程消息对列中,并立即返回。
辨析:shuishi32 在给出翻译的还给对ddlddy的问题:“我用SendMessage(hWnd,WM_QUIT,NULL,NULL)和PostMessage(hWnd,WM_QUIT,NULL,NULL)去关闭一指定窗口,SendMessage的不能实现,可以解释一下吗?我主要的就是想知道这个!”给出了解答:WM_QUIT是通知系统关闭,这个消息只有系统通过GetMessage来返回0达到线程关闭的。而SendMessage发送的消息不会到系统对列中,它只是处理,而PostMessage就会发送到系统队列中。 另外可以用SendMessage(hWnd, WM_CLOSE, 0, 0);来关闭对话框。
这是一个很多朋友曾经问过的问题,我推荐大家看win32消息机制方面的书籍,比如《Windows 程序设计》、《Windows 环境下32位汇编程序设计》(不是非要用到汇编才需要看这本书,^-^)。
WM_CLOSE、WM_DESTROY、WM_QUIT, SENDMESSAGE ,POSTMESSAGE相关推荐
- VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解
目录 一.代码背景 二.主要工具 三.函数解析 1.FindWindow: 2. FindWindowEx: 3.SendMessage: 四.具体代码示例: 1.第一部分功能: A.接收端: B.发 ...
- 总结OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别(转)
目录(?)[+] cDialogonokenddialogdestroywindow区别 收藏 1摘要 2模式对话框的显示 3模式对话框的循环等待 4模式对话框的循环终止 5与OK和Cancle按钮的 ...
- 关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框
关于OnOK().OnCancel().OnClose().OnDestroy() 模式对话框 http://www.cnblogs.com/minvt/archive/2009/11/16/1603 ...
- VC编程Windows消息处理机制、阻塞试验、SetTimer、MessageBox、小心消息响应处理函数
VC6标准WIN32程序,Windows消息处理机制: 1.在注册窗口类时,指定了消息处理函数WndProc(). 2.WinMain()里有消息循环: while (GetMessage(& ...
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结...
网站地址:http://www.itmian4.com 基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. ...
- GetMessage PeekMessage SendMessage PostMessage
GetMessage () and PeekMessage () GetMessage 其唯一用途就是从事件对列中获得消息,并进行处理.当程序在等待通过 GetMessage 传递的消息时,主事件循坏 ...
- OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别
第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数, 即WM消息响应函数. 从应用程序结构的角度,拿对话框 ...
- 重载OnOK、OnCancel、OnClose
转载:https://www.cnblogs.com/BeyondTechnology/archive/2011/02/20/1959293.html 推荐:深入浅出 重载OnOK.OnCancel. ...
- 【MFC】关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框
第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数.从应用程序结构的角度,拿对话框来说,红 ...
最新文章
- CSipSimple 工程分析 1
- 独家 | 一文读懂机器学习中的贝叶斯统计学
- 在Mac配置adb命令
- 数字电路时钟问题——Jitter与Skew区别
- Web Essentials之样式表StyleSheets
- Android shape
- 如何在Linux下统计高速网络中的流量
- mysql safe无法启动_解决mysqld_safe无法启动问题的方法
- IDEA生成toString方法的快捷键
- Flask中的请求上下文和应用上下文
- java面试题41 下面字段声明中哪一个在interface主体内是合法的? ()
- scp带密码后台传输
- Java实训项目13:GUI学生信息管理系统 - 实现步骤 - 创建应用程序类
- udp linux 获取本机ip
- 项目Alpha冲刺(6/10)
- 20162304 2016-2017-2 《程序设计与数据结构》第5周学习总结
- 使用腾讯云服务器搭建自己网站应该怎么做
- 用户画像第二章(企业级360°用户画像_数据调研及ETL)
- UI控件DevExpress WinForm新手指南——如何在应用启动时执行操作
- 【云原生 · Docker】入门篇:安装、镜像加速