美文网首页
Windows消息机制

Windows消息机制

作者: 上官宏竹 | 来源:发表于2022-12-14 15:34 被阅读0次

消息结构体

typedef struct tagMSG
{
    HWND hwnd;      //窗口句柄。
    UINT message;   //消息类型。
    WPARAM wParam;  //32位附加信息。
    LPARAM lParam;  //32位附加信息。
    DWORD time;     //消息发送时间。
    POINT pt;       //消息发送时,鼠标所在位置。
} MSG; 

消息队列

消息队列有两种,分为系统消息队列和应用程序消息队列。产生的消息首先由Windows系统捕获,放在系统消息队列,再拷贝到对应的应用程序消息队列。

消息循环

消息循环会不断检索自身的消息队列。每有一个消息,就用GetMessage()取出消息。

while(GetMessage (&msg, NULL, 0, 0)) //Windows消息循环。
{
    TranslateMessage(&msg); //翻译消息,如按键消息,翻译为WM_CHAR
    DispatchMessage(&msg);  //分发消息到对应窗口
}

当用户运行一个应用程序,通过对鼠标的点击或键盘按键,产生一些特定事件。由于Windows一直监控着I/O设备,该事件首先会被翻译成消息,由系统捕获,存放于系统消息队列。经分析,Windows知道该消息应由那个应用程序处理,则拷贝到相应的应用程序消息队列。由于消息循环不断检索自身的消息队列,当发现应用程序消息队列里有消息,就用GetMessage()取出消息,封装成Msg()结构。如果该消息是由键盘按键产生的,用TranslateMessage()翻译为WM_CHAR消息,否则,用DisPatchMessage()将取出的消息分发到相应的应用程序窗口,交由窗口处理程序处理。Windows为每个窗体预留了过程窗口函数,该函数是一个回掉函数,由系统调用,应用程序不能调用。程序员可以通过重载该函数处理我们”感兴趣”的消息。对于不感兴趣的消息,则由系统默认的窗口过程处理程序做出处理。

windows消息循环的详细过程:
  1. 我们创建完win32应用程序,当用户通过对鼠标,键盘操作应用程序时,由于Windows一直监控着I/O设备,该事件首先会被转化成消息,由windows系统捕获,存放于系统消息队列。
  2. Windows系统知道该消息应由哪个应用程序处理,然后拷贝到相应的应用程序消息队列。同时将该消息从系统消息队列中删除。
  3. 应用程序的消息循环不断在执行,此时,调用GetMessage()从消息队列中查找消息,发现了该消息,GetMessage()将返回一个正值,并获取到了该消息Msg;PS:如果消息队列为空,程序将停止执行并等待(程序阻塞)。
  4. 然后取出消息(Msg)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步。
  5. 上面的步骤执行完后,将消息MSG传递给DispatchMessage()函数。DispatchMessage()函数将消息再给windows系统,由windows系统找到目标窗口并分发给该窗口,调用消息对应的窗口过程函数,既窗口的WinPro函数,让WinPro函数处理。WinPro函数可以允许我们对不同的消息做特定的处理,若不处理的话,则会调用DefWindowProc函数,做默认处理,所以为什么默认代码中WinPro的类型是CallBack(回调),因为不是我们主动调用的,是系统回调的
  6. 一旦一个消息处理完成,窗口过程WinPro函数返回,DispatchMessage()函数返回,应用程序的消息循环继续while循环,Window系统继续监控各类消息,重复上述步骤

参考:Windows消息循环机制

定时器消息

Windows定时器的使用说明

模态对话框实现原理

对话框接收了应用的消息循环。
MFC 模态对话框的实现原理
自实现一个模态对话框。

QT消息循环机制

参考: [https://zhuanlan.zhihu.com/p/113695485]

相关文章

  • windows消息机制(MFC)

    windows消息机制(MFC) 消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,...

  • WPF消息机制

    前言 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows ...

  • iOS触摸事件专题一

    事件的概念类似Windows 编程下的消息。 iOS中的事件响应也和Windows下的消息循环机制相似,当用户触发...

  • iOS中事件传递和响应者链的关系(只针对触摸事件)

    事件的概念类似Windows 编程下的消息。iOS中的事件响应也和Windows下的消息循环机制相似,当用户触发各...

  • Windows消息机制的理解

    一. 消息的概念 当用户单击鼠标、改变窗口大小或者按下键盘上的一个键等用户动作时,会触发点击,按键等事件,而...

  • Hook简介

    概要 windows消息机制:os监听\捕捉事件->os向应用程序消息队列发送消息->应用程序利用getmessa...

  • Android 的消息队列模型

    Android是参考Windows的消息循环机制来实现Android自身的消息循环的。 Android通过Loop...

  • 消息机制

    消息机制 Windows消息系统是由以下三部分构成的:1、消息队列2、消息循环3、窗口过程 关于消息、窗口过程 一...

  • Looper和Handler —— Android 消息驱动机制

    Looper和Handler —— Android 消息驱动机制 Android 与 Windows 系统一样也是...

  • Android消息循环机制浅析

    Android消息机制概略 从根本上来说Android系统同windows系统一样,也属于消息驱动型系统 消息驱动...

网友评论

      本文标题:Windows消息机制

      本文链接:https://www.haomeiwen.com/subject/aamhhltx.html