解释一下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中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
Aug 04 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
Feb 06 面试题
在C语言中实现抽象数据类型什么方法最好
Jun 26 面试题
android面试问题与答案
Dec 27 面试题
SQL Server面试题
Oct 17 面试题
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
Nov 26 面试题
如何判断计算机可能已经中马
Mar 22 面试题
C#如何调用Word并打开一个Word文档
May 08 面试题
几道Java和数据库的面试题
May 30 面试题
九州传奇上机题
Jul 10 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
Oct 13 面试题
德尔福集团DELPHI的笔试题
Feb 22 面试题
编写函数,将一个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/03 日漫
Protoss热键控制
2020/03/14 星际争霸
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
深入php数据采集的详解
2013/06/02 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
C/C++有关内存的思考题
2015/12/04 面试题
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
技术总监的工作职责
2013/11/13 职场文书
财经学院自荐信范文
2014/02/02 职场文书
学习交流会主持词
2014/04/01 职场文书
商场消防安全责任书
2014/07/29 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang