zoukankan      html  css  js  c++  java
  • Windows消息理解(系统消息队列,进程消息队列,非队列消息)

    // ====================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

  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/findumars/p/3273555.html
Copyright © 2011-2022 走看看