一直对windows消息循环不太清楚,今天做个详细的总结,有说错的地方,请务必指出。

用VS2017新建一个win32 Application的默认代码如下:

这里有几个概念,容易混淆:

1.系统:

特指windows操作系统

2.应用程序:

指一个程序,比如QQ,或者酷狗之类的都算一个应用程序

3.窗口:

每个应用程序都可以拥有窗口,而且可以有多个,但一般会有一个主窗口。例如QQ的主窗口,但是QQ也有很多类似于设置窗口的子窗口,这些窗口都属于QQ应用程序。

4.消息:

window系统定义了很多种消息,例如,单击鼠标、改变窗口尺寸、按下键盘,这些操作都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息

5.消息循环:

window系统的一种消息机制

6.消息队列:

是属于线程的,是windows系统为线程创建并维护的一个队列,用于存放各类消息。系统自身维护一个系统消息队列,然后还为每个GUI线程线程维护一个线程专门消息队列。

7.线程:

每个线程默认是没有消息队列的,线程只有在第一次调用用户接口时(比如创建窗口,或者是操作UI元素时),系统才为其创建消息队列。一个应用程序可以有多个线程,但只能有一个UI线程,默认为主线程,其他子线程是无法操作UI并创建UI元素的。这是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消息循环机制相关推荐

  1. Windows消息循环机制详细概述

    首先来了解几个基本概念: 消息:在了解什么是消息先来了解什么是事件.事件可分为几种,由输入设备触发的,比如鼠标键盘等等.由窗体控件触发的,比如button控件,file菜单等.还有就是来自Window ...

  2. android 结束if循环_Android Handler 消息循环机制

    前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...

  3. Windows消息响应机制之四:PostQuitMessage和GetMessage函数

    Windows是消息驱动的操作系统.在Windows环境下编程必须熟练掌握Windows消息响应机制.  今天在练习Win32编程时碰到一个关于GetMessage函数的问题.这个问题之前一直没有引起 ...

  4. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  5. Android的消息循环机制:Handler

    前言 Android的消息机制主要是指Handler的运行机制,对于大家来说Handler已经是轻车熟路了,可是真的掌握了Handler?本文主要通过几个问题围绕着Handler展开深入并拓展的了解. ...

  6. C++-Windows消息循环GetMessage/TranslateMessage/DispatchMessage

    1.windows消息循环 if (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg); //消息转化DispatchMessa ...

  7. 深入理解Windows消息循环

    理解消息循环和整个消息传送机制对Windows编程来说非常重要.如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方. 什么是消息(Message) 每个消息是一个整型数值, ...

  8. android 消息循环机制--looper handler

    Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...

  9. Windows消息循环理解及窗体创建步骤

    首先理解一句话:"Windows"向应用程序发送了一条消息.这里是指Windows调用了该程序内部的一个函数. 当UpdateWindow被调用后,新建的窗口在屏幕便完全可见了.此 ...

最新文章

  1. linux sudo命令
  2. saltstack一些常用模块和api调用方法
  3. 逻辑回归模型(Logistic Regression, LR)基础 - 文赛平
  4. Linux设备驱动开发概述
  5. thinkphp验证是否登录并跳转
  6. v-modedl的修饰符
  7. 文件给制实施规定的实例(GB8567-88)
  8. window-linux移植
  9. jQuery--捕获键盘敲击
  10. Python学习笔记 03 Python对象
  11. 一个奇怪现象的分析过程
  12. 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。
  13. 【JAVA程序设计】(C00005)基于springboot的进存销管理系统
  14. C++必须掌握的15道技术面试题
  15. 软件测试好学吗 有哪些好的学习建议
  16. 元组创建、删除、最大值、最小值、求长度、计数
  17. 联想G40-30进入PE鼠标键盘失灵解决方法
  18. paypal付款,PayPal Subscribe和PayPal Check Out的区别
  19. 嵌入式安全被忽视的 3 个原因
  20. C/C++趣味代码-------狸猫换太子

热门文章

  1. HBASE ERROR: Table already exists: FileTable! list时候却查不到表
  2. 1202此服务器的证书无效,ios - iOS:URLRequest错误域= NSURLErrorDomain代码= -1202“此服务器的证书无效 - 堆栈内存溢出...
  3. 开发提交审核流程_小程序如何提交审核,多久能通过?
  4. python 中国社区_python
  5. CPU为什么是方形而不是圆形的?
  6. java 控制 crt_secureCRT关闭连接自动关闭tomcat服务
  7. LL-verilog语法多位宽全加器
  8. 平台和计算机技术,两大平台技术提升及优势功能PK对比
  9. mysql生活应用_MySQL应用
  10. 大学生php实训心得1500_【有奖征文】第五届大学生国际学术研讨会