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

面试题 相关文章推荐
得到Class的三个过程是什么
Aug 10 面试题
Java中compareTo和compare的区别
Apr 12 面试题
编写用C语言实现的求n阶阶乘问题的递归算法
Oct 21 面试题
一套SQL笔试题
Aug 14 面试题
进程的查看和调度分别使用什么命令
Dec 14 面试题
敏捷开发的主要原则都有哪些
Apr 26 面试题
Prototype如何实现页面局部定时刷新
Aug 06 面试题
Python里面search()和match()的区别
Sep 21 面试题
Java程序员常见面试题
Jul 16 面试题
Java中的基本数据类型所占存储空间大小固定的吗
Feb 15 面试题
建龙钢铁面试总结
Apr 15 面试题
介绍一下javax.servlet.Servlet接口及其主要方法
Nov 30 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python实现的简单算术游戏实例
2015/05/26 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
flask中的wtforms使用方法
2018/07/21 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
python游戏开发的五个案例分享
2020/03/09 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
护士自我鉴定
2013/10/23 职场文书
企划经理的岗位职责
2013/11/17 职场文书
北京大学自荐信范文
2014/01/28 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
运动会表扬稿
2015/01/16 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
MySQL Server 层四个日志
2022/03/31 MySQL