美文网首页
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消息机制

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