zoukankan      html  css  js  c++  java
  • windows编程——消息机制

    为什么会想学习windows编程呢?因为目前为止我的所有程序都是在windows平台下面运行的。为什么不学习呢?
    今天我想记录一下自己对windows消息机制的理解。
    之前我学习的C/C++编程,程序运行都是按照我们的严格按照我们编写的代码一步一步执行的。
    但是windows编程** 消息处理 **就明显不是在入口函数里面我们来调用。这里的区别我们仅仅从代码上面就可以看出来。
    我们除了在初始化WNDCLASS实例的时候以及在进行消息循环的时候,出现过感觉可以和消息处理函数相关的代码。

          While(GetMessage(&msg,NULL,0,0))
          {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
          }
    

    整个WinMain()里面我们我们就没有关于整个消息处理的相关代码。那我们不调用,那谁来调用呢?
    这个当然不是玄学,Windows除了咱们的用户模式,还有操作系统模式。如果不是我们自己调用,那么只有是操作系统自己在调用消息处理函数
    理解好了这个到底“谁调用谁”的关系后,消息机制咱们也算理解得差不多了。
    接下来我们进行更加详细的讨论:
    1、我们先对消息结构进行一个简单的理解。
    MSG在Windows中声明如下:

          { 
                HWND hwnd;          // 接受该消息的窗口句柄 
                UINT message;         // 消息常量标识符,也就是我们通常所说的消息号 
                WPARAM wParam;     // 32位消息的特定附加信息,确切含义依赖于消息值 
                LPARAM lParam;       // 32位消息的特定附加信息,确切含义依赖于消息值 
                DWORD time;         // 消息创建时的时间 
                POINT pt;             // 消息创建时的鼠标/光标在屏幕坐标系中的位置 
          }MSG;
    
      现在我们没有完全理解这些参数的意义,但是我们在使用windows系统的时候我们明显会有疑问,为什么windows知道我们操作的是哪一个窗口?MSG里面我们明显看到了POINT这个参数,显然,windows在判断用户相关窗口操作的时候,消息产生的位置是一个重要的参考信息。
    

    在WinMain()里面:

    While(GetMessage(&msg,NULL,0,0))
          {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
    }
    

    仅仅只有在发生WM_QUIT消息产生的时候,GetMessage()函数才会返回0。才会停止消息循环。所以我们可以把它当成一个死循环。
    DisPatchMessage()会把我们翻译过来的消息,分发到我们应用程序里面。同时操作系统会调用相应窗口的回调函数。

  • 相关阅读:
    SqlDependency和SqlCacheDependency的若干说明
    sublime 3 随笔
    [有得]解决redmine写操作很慢的问题
    Java双重循环
    使用 Docker 打包 Rust Web 服务
    Centos8.3、hadoop-2.6.4 简单的日志分析实验
    广域网数据交换的三种方式
    计算机的起源与发展
    推荐两款生成数据库表结构说明文档工具
    Centos8.3、docker部署springboot项目实战记录
  • 原文地址:https://www.cnblogs.com/kadcyh/p/13635641.html
Copyright © 2011-2022 走看看