// ====================Windows消息分类==========================
在Windows中,消息分为以下三类:
标准消息——除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。从CWnd派生的类,都可以接收到这类消息。
命令消息——来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND形式呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。
通告消息——由控件产生的消息,例如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现的。从CCmdTarget派生的类,都可以接收到这类消息。
通过MSDN通过的MFC类层次结构图,可以发现CWnd类实际上派生于CCmdTarget类。也就是说,凡是从CWnd派生的类,它们既可以接收标准消息,也可以接收命令消息和通告消息。而对于那些从CCmdTarget派生的类,则只能接收命令消息和通告消息,不能接收标准消息。

1.标准消息 
除WM_COMMAND之外,所有以WM_开头的消息。 从CWnd派生的类,都可以接收到这类消息。 
2.命令消息 
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。 CCmdTarget派生的类,都可以接收到这类消息。 
3.通告消息 
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。 从CCmdTarget派生的类,都可以接收到这类消息。

1.只要是CCmdTarget派生的类都可以接受消息,都可以设定自己的Message Map。对于标准消息(WM_XXX)只要是派生于CWnd都可以接收这类消息。
2.命令消息是来自菜单和工具栏按钮的消息。
3.通告消息是指来自控件的消息,如Button,List,Edit等等

// ====================进程与非队列消息==========================

一个进程,如果包含了消息对象成员所描述的窗口句柄的话,那么该进程就是消息所要去的目的地。
按照所属的不同,消息队列分为系统消息队列和进程消息队列。系统消息队列由操作系统负责维护,进程消息队列由进程负责维护。

是不是每个进程都具有消息队列呢?回答是否定的。在Windows下,只有那些具备窗口(GUI用户接口界面)的进程,才会有消息队列,那些不具备GUI的进程是没有消息队列的。也就是说:操作系统在开启一个新的进程时,并没有为其创建消息队列,而是当进程第一次调用GDI函数后,才创建,并且进程持有窗口时,才持有消息队列。

是不是系统消息队列存取操作就是系统的事件发布函数(WinProc),而进程消息队列存取操作就是进程的事件发布函数呢?是的,在消息到达具体窗口之前,事件发布函数不是一个孤零零的C/C++意义上的函数,它更像一个机构,包含消息的收、存和发等操作。一般情况下,队列化消息基本上是用户输入的结果,队列消息的操作都是通过消息循环来完成的。对于消息队列而言,所谓的消息循环就是这样一个循环,不断地访问消息队列,检测队列中有没有消息存在,如果有,就取出发布。

消息到达具体窗口后,那么对消息的管理就由窗口过程(窗口事件发布函数WinProc)来负责管理了。

那么有了队列化消息概念,相应也有非队列消息的概念。队列化消息是指那些通过投递方式进入消息队列的消息。相应地,那些没有被投递到消息队列,而直接发送给窗口事件发布函数的消息就是非队列消息。非队列消息一经发送发送到窗口,窗口事件发布函数就会对其进行分析处理。
一般情况下,非队列化消息来自呼叫特定的Windows函数。例如:
当WinMain呼叫CreateWindow时,Windows将建立窗口并在处理中给窗口事件发布函数传递一个WM_CREATE消息;
当WinMain呼叫ShowWindow时,Windows将给窗口事件发布函数传递WM_SIZE和WM_SHOWWINDOW消息;
当WinMain呼叫UpdateWindow时,Windows将给窗口事件发布函数传递WM_PAINT消息。
也就是说非队列消息将会绕过系统消息队列,直接发送到窗口过程。

参考:
http://blog.csdn.net/mengde666/article/details/4036398

Edit的消息循环:
http://blog.csdn.net/mengde666/article/details/4045666

Windows消息理解(系统消息队列,进程消息队列,非队列消息)的更多相关文章

  1. RabbitMQ消息队列入门(一)——RabbitMQ消息队列的安装(Windows环境下)

    一.RabbitMQ介绍1.RabbitMQ简介RabbitMQ是一个消息代理:它接受和转发消息.你可以把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你可以确定邮差先生最终将邮件发送给你的收 ...

  2. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  3. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

  4. C# Azure 消息队列ServiceBus (服务总线队列)

    1. 前言 在阅读本文之前,可以查看微软官方的说明. https://www.azure.cn/documentation/articles/service-bus-create-queues/ 2. ...

  5. 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用

    目录 定义的接口 接口实现 建立队列工厂 写入队列 获取消息 什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消 ...

  6. (八)RabbitMQ消息队列-通过Topic主题模式分发消息

    原文:(八)RabbitMQ消息队列-通过Topic主题模式分发消息 前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过 ...

  7. Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化

    在上一篇中,我们介绍了消息的顺序收发保证: Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证 在本文中我们主要介绍下复杂对象消息是否需要支持序列 ...

  8. RabbitMQ消息队列(一): 简单队列

    1. 示例选用python的pika模块进行测试,需要预先安装pika模块: https://pypi.python.org/pypi/pika/0.10.0#downloads 上述地址下载源码,加 ...

  9. rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间

    上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...

随机推荐

  1. nowcoder 79F 小H和圣诞树 换根 DP + 根号分治

    设节点个数大于 $\sqrt n$ 的颜色为关键颜色,那么可以证明关键颜色最多有 $\sqrt n$ 个.对于每个关键颜色,暴力预处理出该颜色到查询中另一个颜色的距离和. 对于不是关键颜色的询问,直接 ...

  2. sweetalert2 全面替代 alert ,从 sweetalert2 弹出 text 到 弹出 Dom 以及模态框和取消 sweetalert2 的 OK 按钮

    1. 简易基本版 sweetalert 涵盖日常基本的弹出及对话框 2. 升级版本 sweetalert2 满足常见开发工作中的各种要求 3 取消 OK 按钮, 只需要设置 showConfirmBu ...

  3. sqli-labs(24)

    0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 0x2 什么是二阶注入 二阶注入是指客通过构造数据的形式,在浏览器或者 ...

  4. [CSP-S模拟测试]:简单的括号序列(组合数)

    题目传送门(内部题82) 输入格式 一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$. 输出格式 一行一个整数,表示满足要求的子序列数对$10^9+7$的结果. 样例 样例输入1: ...

  5. centos7 升级gcc9.1.0版本

    centos7 环境 查缺补漏 yum install gcc gcc-c++ -y yum install bzip2 -y gcc版本下载:https://gcc.gnu.org/mirrors. ...

  6. leetcode-mid-math -171. Excel Sheet Column Number

    mycode   90.39% class Solution(object): def titleToNumber(self, s): """ :type s: str ...

  7. 如果将get请求转换成post请求

    td><a href="emp/${emp.id}">Edit</a></td> <form action="" ...

  8. [VBA]删除多余工作表

    sub 删除多余工作表() Dim i As Integer Application.DisplayAlerts = False For i = Worksheets.Count To 1 step ...

  9. 【1】mongoDB 的安装及启动

    MongoDB是一个面向文档(document-oriented)的数据库,不是关系型数据库.与关系型数据库相比,面向文档的数据库没有"行"的概念,取而代之的是"文档&q ...

  10. NumericStream && Stream综合练习

    一.NumericStream 我们可以将一个Stream转化为对应的数字Stream,如mapToInt.mapToLong转化为IntStream.LongStream等(NumericStrea ...