Windows运行机理这系列文章都是来至于《零基础学Qt4编程》——吴迪,个人觉得写得很好,所以进行了搬运和个人加工

Windows程序设计时一种基于消息的时机驱动方式的设计模式,完全不同于传动的DOS方式的程序设计方法,在Windows中,编程的框架都是响应和发送消息。例如,当用户在窗口中画图的时候,按下鼠标左键,此时操作系统会感知这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并响应,在这处理过程中,操作系统也给应用系统发送消息,所谓的“发送消息”,实际上是操作系统调用程序中一个专门处理消息的函数,称为窗口过程。

1. 消息

在windows 程序中,消息是由MSG 结构体来表示的。MSG 结构体的定义如下:

typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;

该结构体中各成员变量的含义如下:

hwnd 表示消息所属的窗口。我们开发的程序都是窗口应用程序,消息一般都是与某个
窗口相关联的。在Windows 程序中,用HWND 类型的变量来标识窗口。
message 变量指定了消息的标识符。在Windows 中,消息是由一个数值来表示的,不同
的消息对应不同的数值。但是由于数值不便于记忆,所以Windows 将消息对应的数值定义
为WM_XXX 宏(WM 是Window Message 的缩写)的形式,XXX 对应某种消息的英文拼写的大
写形式。例如,鼠标左键按下的消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字
符消息是WM_CHAR 等等。在程序中,我们通常都是用WM_XXX 宏的形式来使用消息的。
此外,我们可以定义自己的消息,并给窗口发送这些消息,您完全不用担心如何使这
些消息与代码联系起来,因为这是应用程序框架的事情。但是另一方面,这也在一定程度上
固定了程序设计上的一些结构。
wParam 和lParam 用于指定消息的其他附加信息。比如,当我们收到一个字符消息的时
候,message 成员变量的值就是WM_CHAR,但用户输入的是那些字符,就由wParam 和
lParam 来说明。wParam、lParam 表示的信息随消息的不同而有变化。

time 和pt 分别表示消息投递到消息队列的时间和鼠标的当前位置。

2. 消息队列

每一个Windows 应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消
息队列用来存放该程序创建的窗口的消息。Windows 将产生的消息依次放入消息队列中,而
应用程序则通过消息循环不断从队列中取出消息,进行响应。这种消息机制,就是Windows

程序运行的基本机制。

Windows运行机理——消息与消息队列相关推荐

  1. windows消息和消息队列详解

     windows消息和消息队列 与基于MS - DOS的应用程序不同,Windows的应用程序是事件(消息)驱动的.它们不会显式地调用函数(如C运行时库调用)来获取输入,而是等待windows向它们传 ...

  2. 关于windows操作系统之消息和消息队列

    关于消息和消息队列 不像基于MS-DOS的应用程序,基于Windows的程序是事件驱动的.他们不做任何显示调用来获取输入.而是通过等待系统传递给他们. 系统为应用程序传递所有输入到程序中的不同窗口.每 ...

  3. Windows程序的窗口和消息 -- 一个Windows程序从生到死

    注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 1.一个完 ...

  4. 操作系统-消息,消息队列

    消息,消息队列 1. 消息 在windows 程序中,消息是由MSG 结构体来表示的.MSG 结构体的定义如下: typedef struct tagMSG {HWND hwnd;UINT messa ...

  5. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  6. arouter跨module传递消息_消息队列中间件(二)使用 ActiveMQ

    ActiveMQ 介绍 Active MQ 是由 Apache 出品的一款流行的功能强大的开源消息中间件,它速度快,支持跨语言的客户端,具有易于使用的企业集成模式和许多的高级功能,同时完全支持 JSM ...

  7. vs如何实现tcp连续发送多条消息_消息队列之 RabbitMQ

    为什么要使用MQ消息中间件?它解决了什么问题?关于为什么要使用消息中间件?消息中间件是如何做到同步变异步.流量削锋.应用解耦的?网上已经有很多说明,我这里就不再说明.我在接下来的RabbitMq系列博 ...

  8. java 如何判定消息已在队列_Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得.题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一个 ...

  9. videojs如何获取请求消息_消息队列中,如何保证消息的顺序性?

    点击?蓝色" 深入原理",关注并"设为星标" 技术干货,第一时间推送 消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的 ...

  10. ActiveMQ消息持久化_队列_7

    消息持久话 一 . 持久化 1.1  非持久 messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT) 非持久化:当服务器宕机,消息不存 ...

最新文章

  1. 通过Python的__slots__节省9GB内存
  2. 每日源码分析-Lodash(uniq.js)
  3. HashSet源码分析 jdk1.6
  4. android http协议添加Authorization认证方式
  5. 图像识别:微信跳一跳机器人
  6. java 两个list相等_java 怎么比较两个list是否相同
  7. 让我变得开朗了很多哦
  8. GB-T2260-2020 <中华人民共和国县以上行政区划代码>
  9. jade6.5安装教程
  10. Oracle--替代触发器(INSTEAD OF)
  11. 自定义android时间表盘选择器
  12. JEOL即日起推出ECZ Luminous全新高分辨率核磁共振系统
  13. EXCEL基本功能 --- 数据透视表
  14. XCTF-PWN pwn-200(使用DynELF利用write泄露system地址)
  15. 半导体TEC高低温实验设备-温控仪|固体温度控制、实验、科研
  16. 无聊的小技巧-idea启动springboot时设置启动参数
  17. c语言remove和rename不起作用,C语言探索之旅 | 第二部分第七课:文件读写
  18. Xshell 和 Xftp 学校免费版
  19. Linux基础知识:架设邮件服务器
  20. 微信小程序环境共享,多个小程序共享一个云开发数据库

热门文章

  1. 哲学家谈“情绪”——欲望以上,理性未满
  2. Java 基础 - List 遍历时为什么不能通过 for 循环进行删除,而使用 Iterator 可以 ?
  3. 创业公司天使轮、A轮、B轮、IPO融资时股权问题
  4. 称重系统中应用车牌识别实现无人值守称重系统解决方案
  5. 无人值守称重系统解决方案,加快企业数字化发展
  6. springboot打包错误:Failed to execute goal org.apache.maven.pluginsmaven-resources-plugin3.2.0
  7. 金蝶云苍穹笔记(一)
  8. IIS 配置网站出现500内部服务器错误,显示具体错误信息
  9. Python-Pyecharts画图(饼图,雷达图,词云)[二]
  10. C语言变量inv,编写一个函数inv,将数组a中n个整数按相反顺序存放,用指针变量作为调用该函数时的实参...