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

面试题 相关文章推荐
PHP如何去执行一个SQL语句
Mar 05 面试题
String这个类型的class为何定义成final?
Nov 13 面试题
Java的for语句中break, continue和return的区别
Dec 19 面试题
请用用Java代码写一个堆栈
Jan 26 面试题
创建索引时需要注意的事项
May 13 面试题
亿阳信通股份有限公司笔试题(C#)
Mar 04 面试题
STP的判定过程
Oct 01 面试题
TCP/IP模型的分界线
Dec 01 面试题
linux面试题参考答案(1)
Jan 22 面试题
面向对象设计的原则是什么
Feb 13 面试题
EJB的几种类型
Aug 15 面试题
MYSQL相比于其他数据库有哪些特点
Jul 19 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
星际争霸任务指南——人族
2020/03/04 星际争霸
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
WAF的正确bypass
2017/01/05 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
Python字符串和文件操作常用函数分析
2015/04/08 Python
浅析Python中signal包的使用
2015/11/13 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
python正则-re的用法详解
2019/07/28 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
CSS3实现swap交换动画
2016/01/19 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
长安大学毕业生自我鉴定
2014/01/17 职场文书
工作会议方案
2014/05/21 职场文书
检讨书范文大全
2015/05/07 职场文书
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS