解释一下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...

面试题 相关文章推荐
面向对象编程OOP的优点
Jan 22 面试题
构造方法和其他方法的区别?怎么调用父类的构造方法
Sep 22 面试题
几个SQL的面试题
Mar 08 面试题
什么是数据库锁?Oracle中都有哪些类型的锁?
Aug 21 面试题
杭州-DOTNET笔试题集
Sep 25 面试题
什么是WEB控件?使用WEB控件有哪些优势?
Jan 21 面试题
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
Dec 12 面试题
标记环网Toke Ring IEEE802.5
May 26 面试题
南京某公司笔试题
Jan 27 面试题
linux面试题参考答案(1)
Jan 22 面试题
Shell编程面试题
May 30 面试题
什么是GWT的Module
Jan 20 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
详解Python中的正则表达式
2018/07/08 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
品学兼优的大学生自我评价
2013/09/20 职场文书
车间主管岗位职责
2013/11/14 职场文书
自行车广告词大全
2014/03/21 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
出国导师推荐信
2015/03/25 职场文书