解释一下Windows的消息机制


Posted in 面试题 onJanuary 30, 2014
Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
Windows系统中有两种消息队列:系统消息队列和应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将消息拷贝到相应的应用程序消息队列中。应用程序的消息处理程序将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。这便是一个事件从发生至到达窗口函数必须经历的过程。
必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。

Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得,并且对于一般的消息,此函数返回非零值,但是对于WM_QUIT消息,返回零。可以通过这个特征,结束程序。当取得消息之后,应该先转换消息,再分发消息。所谓转换,就是把键盘码的转换,所谓分发,就是把消息分发给对应的窗口,由对应的窗口处理消息,这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功能:TranslateMessage和DispatchMessage。
另外,需要注意,当我们点击窗口的关闭按钮关闭窗口时,程序并没有自动退出,而是向程序发送了一个WM_DESTROY消息(其实过程是这样的,首先向程序发送WM_CLOSE消息,默认的处理程序是调用DestroyWindow销毁窗体,从而引发WM_DESTROY消息),此时在窗体中我们要响应这个消息,如果需要退出程序,那么就要向程序发送WM_QUIT消息(通过PostQuitMessage实现)。一个窗体如果想要调用自己的消息处理函数,可以使用SendMessage向自己发消息。
如上所述,大部分(注意是大部分)的消息是这样传递的:首先放到进程的消息队列中,之后由GetMessage取出,转换后,分发给对应的窗口。这种消息成为存储式消息。存储式消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP讯息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。存储式消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。但是也有的消息是直接发送给窗口的,它们被称为非存储式消息。例如,当WinMain调用CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理函数发送一个WM_CREATE消息。当WinMain调用ShowWindow时,Windows将给窗口消息处理函数发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain调用UpdateWindow时,Windows将给窗口消息处理函数发送WM_PAINT消息。

Tags in this post...

面试题 相关文章推荐
存储过程的优点有哪些
Sep 27 面试题
什么是反射?如何实现反射?
Jul 25 面试题
如何查找网页漏洞
Jun 22 面试题
C# .NET面试题
Nov 28 面试题
如何在C# winform中异步调用web services
Sep 21 面试题
UML设计模式笔试题
Jun 07 面试题
几个常见的消息中间件(MOM)
Jan 08 面试题
解释一下钝化(Swap out)
Dec 26 面试题
Ajxa常见问题都有哪些
Mar 26 面试题
用Python写一个for循环的例子
Jul 19 面试题
几道Java和数据库的面试题
May 30 面试题
MVC的各个部分都有那些技术来实现?如何实现?
Apr 21 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
模仿OSO的论坛(二)
2006/10/09 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
javascript 回调函数详解
2014/11/11 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
python简单实现获取当前时间
2016/08/27 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
python实现自主查询实时天气
2018/06/22 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
精选干货:Java精选笔试题附答案
2014/01/18 面试题
毕业生自荐书
2013/12/18 职场文书
中英文自我评价常用句型
2013/12/19 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
文明班级建设方案
2014/05/15 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
作风建设剖析材料
2014/10/06 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
python套接字socket通信
2022/04/01 Python