解释一下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语言50道问题
Oct 23 面试题
C++是不是类型安全的
Feb 18 面试题
动态密码技术
Oct 18 面试题
linux面试题参考答案(3)
Sep 13 面试题
linux面试题参考答案(6)
Jun 23 面试题
介绍一下linux文件系统分配策略
Feb 25 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
Oct 17 面试题
Python文件操作的面试题
Jun 22 面试题
MYSQL相比于其他数据库有哪些特点
Jul 19 面试题
AssertionError 跟一下那个类是 “is – a”的关系
Feb 21 面试题
掌上明珠Java程序员面试总结
Feb 23 面试题
Unix如何在一行中运行多个命令
May 29 面试题
编写函数,将一个3*3矩阵转置
Oct 09 #面试题
用C或者C++语言实现SOCKET通信
Feb 24 #面试题
写出一个方法实现冒泡排序
Jul 08 #面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 #面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 #面试题
递归计算如下递归函数的值(斐波拉契)
Feb 04 #面试题
写出二分查找算法的两种实现
May 13 #面试题
You might like
用PHP实现WEB动态网页静态
2006/10/09 PHP
用PHP生成静态HTML速度快类库
2007/03/18 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
Yii2使用$this->context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
经销商培训邀请函
2014/01/21 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
毕业生实习证明
2014/09/19 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
小升初自荐信范文
2015/03/05 职场文书
行政撤诉申请书
2015/05/18 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
父母教会我观后感
2015/06/17 职场文书
运动会3000米加油稿
2015/07/21 职场文书
爱护公物主题班会
2015/08/17 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python