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

面试题 相关文章推荐
Java中实现多态的机制
Aug 09 面试题
static关键字的用法
Oct 07 面试题
程序运行正确, 但退出时却"core dump"了,怎么回事
Feb 19 面试题
下述程序的作用是计算机数组中的最大元素值及其下标
Nov 26 面试题
Android面试题附答案
Dec 08 面试题
.NET方向面试题
Nov 20 面试题
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
Dec 03 面试题
什么是.net
Aug 03 面试题
C#实现启动一个进程
Oct 01 面试题
EJB需直接实现它的业务接口或Home接口吗,请简述理由
Nov 23 面试题
95%的面试官都会问到的50道Java线程题,附答案
Aug 03 面试题
J2EE面试题集锦(附答案)
Aug 16 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
Look And Say 序列php实现代码
2011/05/22 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
jQuery回车实现登录简单实现
2013/08/20 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
matplotlib绘制动画代码示例
2018/01/02 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
python实现烟花小程序
2019/01/30 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
python和php哪个容易学
2020/06/19 Python
python怎么删除缓存文件
2020/07/19 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
后勤人员自我鉴定
2013/10/20 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
财务统计员岗位职责
2015/04/14 职场文书
边城读书笔记
2015/06/29 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
导游词之临安白水涧
2019/11/05 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android