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

面试题 相关文章推荐
凌阳科技股份有限公司C++程序员面试题笔试题
Nov 20 面试题
介绍一下sql server的安全性
Aug 10 面试题
.net开发工程师面试题
Feb 25 面试题
标记环网Toke Ring IEEE802.5
May 26 面试题
初级软件工程师面试题 Junior Software Engineer Interview
Feb 15 面试题
什么是反射
Mar 17 面试题
网上常见的一份Linux面试题(多项选择部分)
Feb 07 面试题
介绍一下linux的文件权限
Feb 15 面试题
Python中如何定义一个函数
Sep 06 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
Aug 18 面试题
Java面试题:请说出如下代码的输出结果
Apr 22 面试题
一套Delphi的笔试题一
Feb 14 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
PHP容易忘记的知识点分享
2013/04/30 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
非常实用的php验证码类
2016/05/15 PHP
PHP实现小偷程序实例
2016/10/31 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
js实现表格筛选功能
2017/01/18 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python实现控制台进度条功能
2016/01/04 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
美国名牌太阳镜折扣网站:Eyedictive
2017/05/15 全球购物
文员个人的求职信范文
2013/09/26 职场文书
大学四年规划书范文
2013/12/27 职场文书
开业典礼主持词
2014/03/21 职场文书
材料化学专业求职信
2014/07/15 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android