DefWindowProc是一个会产生消息的函数
先看一道题目:
当用户点击右上角关闭按钮的时候,请给下列Windows做出的响应排个序:A:发送 WM_QUIT 消息 B:发送 WM_CLOSE 消息 C:发送 WM_DESTROY 消息 D:发送 WM_NCDESTROY 消息 F:发送 WM_COMEBABY 消息
答案是:WM_CLOSE,WM_DESTROY WM_NCDESTROY,WM_QUIT WM_CLOSE。(忽略WM_COMEBABY)
以下是我的测试图片,发现响应WM_CLOSE之后,就不会响应其他的消息了。
既然点击右上角关闭按钮,会发送这么多消息,那么为什么之后不会去WM_DESTROY那里呢?
点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROY WM_NCDESTROY,WM_QUIT WM_CLOSE被拦截之后,后面的消息都不响应了吗?
真实的情况是这样的:
点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROY WM_NCDESTROY,WM_QUIT 。但是这4个消息并非是由点击右上角关闭按钮直接产生的。
点击右上角关闭按钮直接产生的,仅仅是WM_CLOSE消息,如果我们没有去捕获WM_CLOSE,或者捕获后使用的是break而不是return,那么DefWindowProc有机会执行。
DefWindowProc是一个会产生消息的函数,当WM_CLOSE消息产生之后,如果去执行了DefWindowProc函数,那么他会 接着依次连续产生WM_DESTROY WM_NCDESTROY这两个消息。
而在WM_DESTROY处理函数中写上了PostQuitMessage(0)这个函数,WM_QUIT 是由这个函数参数的。WM_QUIT这个消息 在过程函数(WndProc)中无法捕捉到,因为在GetMessage的时候捕获到WM_QUIT 时返回值为0,就会导致主函数退出了。
所以,整个过程就是:
1、点击右上角关闭按钮,产生WM_CLOSE消息。
2、DefWindowProc(hwnd, message, wParam, lParam);被调用产生WM_DESTROY WM_NCDESTROY这两个消息。
3、WM_DESTROY WM_NCDESTROY(如果你捕获了)的处理函数会被执行,在执行WM_DESTROY处理函数是调用PostQuitMessage(0) 产生了WM_QUIT 消息。
4、GetMessage的时候捕获到WM_QUIT 时返回值为0,就会导致主函数退出了。
DefWindowProc是一个会产生消息的函数的更多相关文章
- MFC程序中消息以及函数的处理顺序简介[转]
MFC应用程序中处理消息的顺序 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该 ...
- 终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)
MakeObjectInstance应该不会帮助处理(接收)消息回调函数的返回值,可是有时候又确实需要这个返回值,这可怎么办呢?我是看到这段文字的时候,想到这个问题的: 当WM_PAINT不是由Inv ...
- TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...
- 进程间通信系列 之 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- SCADA 必备函数之 :关于消息的函数
Message Functions BroadcastSystemMessage//是将一条系统消息广播给系统中所有的顶级窗口. BroadcastSystemMessageEx//将消息发送到指定的 ...
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
消息队列函数由msgget.msgctl.msgsnd.msgrcv四个函数组成.下面的表格列出了这四个函数的函数原型及其具体说明. 1. msgget函数原型 msgget(得到消息队列标识符或 ...
- 消息发送函数OSMboxPostOpt()
消息发送函数OSMboxPostOpt() 作用,ucos 3中的消息邮箱,具有广播功能,发送一条消息就可以使所有等待该消息的任务进入就绪状态,从而完成消息分发功能,具有一个消息唤醒多个任务的机制.
随机推荐
- (后台)El表达式格式化两位小数
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>引入标签库. < ...
- (后端)注意hibernate中对象的set方法修改数据库
2017-10-16 公司里面其他人发现了一个问题,五粮液金品库存出现了问题,删除了库存也没还回来,一瓶一千多.而且在我的功能块,在我看出货详情的时候,诡异的事情发生了,第一眼看上去没问题呀,刷新了一 ...
- mysql索引类型 normal, unique, full text
问题1:mysql索引类型normal,unique,full text的区别是什么? normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用 ...
- python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作
一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...
- python第三十天-类
编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很 ...
- Flask消息闪现
目录 Flask消息闪现 简单的例子 闪现消息的类别 过滤闪现消息 Message Flashing 参考 Flask消息闪现 一个好的应用和用户界面都需要良好的反馈.如果用户得不到足够的反馈,那么应 ...
- 模糊查询sql语句条件是中文在后台从数据库查不到结果,是英文和字母就可以,而且统一编码为UTF-8了!!!
4.在mysql安装目录下打开my.ini文件 5.保存,接着打开电脑的服务选项,将MySQL 重启 6. 重启后重新进入dos 窗口的MySQL ,输入show variables like &qu ...
- 【学习笔记】cache/buffer
cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到**加快访问速度**的作用.buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 ...
- React框架简介
React的基本认识 Facebook开源的一个js库,一个用来动态构建用户界面的js库 英文官网,中文官网 React的特点 Declarative(声明式编码),Component-Based(组 ...
- Scala 类型界定
class User(val userName: String,val age: Int) extends Comparable[User] { override def compareTo(o: U ...