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

面试题 相关文章推荐
什么是smarty? Smarty的优点是什么?
Aug 11 面试题
PHP中如何创建和修改数组
May 02 面试题
解释一下ArrayList Vector和LinkedList的实现和区别
Apr 26 面试题
super关键字的用法
Apr 10 面试题
新东网科技Java笔试题
Jul 13 面试题
介绍一下Transact-SQL中SPACE函数的用法
Sep 01 面试题
什么是表空间(tablespace)和系统表空间(System tablespace)
Feb 25 面试题
端口镜像是怎么实现的
Mar 25 面试题
Linux面试题LINUX系统类
Nov 19 面试题
中科软测试工程师面试题
Jun 16 面试题
如何用Java判断一个文件或目录是否存在
Nov 19 面试题
如何写出好的Java代码
Apr 25 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
python删除特定文件的方法
2015/07/30 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
实习生体会的自我评价范文
2013/11/28 职场文书
教育专业自荐书范文
2013/12/17 职场文书
专家推荐信模板
2014/05/09 职场文书
公司2015年终工作总结
2015/05/26 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
redis protocol通信协议及使用详解
2022/07/15 Redis