Windows是消息驱动的操作系统。在Windows环境下编程必须熟练掌握Windows消息响应机制。
 今天在练习Win32编程时碰到一个关于GetMessage函数的问题。这个问题之前一直没有引起过我的注意,但是今天
 在网上搜索发现这个问题很多程序员都跟我一样处于一知半解的状态。
 在Win32应用程序的主函数中有一段消息循环收发的代码:
 while (GetMessage(&Msg, hWnd, 0, 0))
 {
  TranslateMessage(&Msg);
  DispatchMessage(&Msg);
 }
 在Debug环境下启动程序后点击关闭按钮可以正常关闭掉窗口,但是VS2008却无法正常退出执行状态(即应用程序没有正常返回)。于是我按如下步骤进行了Debug:
 (1).在消息处理函数中WM_DESTORY的处理中设置断点,点击关闭按钮case WM_DESROTY代码段可以执行;
 (2).当程序执行到case WM_DESROTY代码段之后再在主函数的TranslateMessage(&Msg)处设置断点
 (3).按下F5发现程序可以执行到TranslateMessage(&Msg)处。
 经过上述步骤Debug后发现当在WM_DESTORY消息处理过程中调用PostQuitMessage(0)函数后程序的消息循环代码段可以继续执行,但是按MSDN的描述PostQuitMessage函数会往线程的消息队列中插入一个WM_QUIT消息,而GetMessage函数在收到WM_QUIT消息后会返回一个非正数。
 后来在网上搜索网友克塞前来拜访的一段解释:
 对PostQuitMessage而言,它实际上并不发送WM_QUIT消息,他所做的实际是设置一些特殊的系统标志,而队列存取体系根据这个标志并结合一些比较复杂的算法来决定在某时某处引发实际的WM_QUIT。当算法临界时,GetMessage(hwnd)照样能获取WM_QUIT。而如果你PostThreadMessage(WM_QUIT),那么一个实际的WM_QUIT消息会被队列,GetMessage(hwnd)永远不会获得这个退出消息。一个最简单的满足算法要求的实验可以是这样:你在WM_CLOSE消息里PostQuitMessage,然后在启动程序后,首先移动窗口,然后关闭窗口,则程序能够正常退出,设置断点调试可以发现,GetMessage(hwnd)确实捕获了这个理论上发给线程队列的退出消息,并且打印内存栈可以发现,消息本身确实是发给线程队列而非窗口队列的。反之,如果你先使hwnd失效,则无论你如何操作,GetMessage(hwnd)永远不会收到退出消息。所以总结起来说,最终能否退出首先取决于hwnd是否失效,虽然这并不是能解释这个问题的根本原因,但至少是一个正确的部分表象原因。
 现阶段由于我个人的水平还无法鉴别其真伪,所以这段解释暂且先记录下来作为日后的学习参考。

Windows消息响应机制之四:PostQuitMessage和GetMessage函数相关推荐

  1. MFC消息响应机制及映射机制理解

    一.MFC消息响应机制分析 ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了 ...

  2. 详谈Windows消息循环机制

    一直对windows消息循环不太清楚,今天做个详细的总结,有说错的地方,请务必指出. 用VS2017新建一个win32 Application的默认代码如下: 这里有几个概念,容易混淆: 1.系统: ...

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

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

  4. 【转】WINDOWS消息响应,以及处理分派机制

    http://www.cppblog.com/deane/archive/2010/01/07/105099.html 转载于:https://www.cnblogs.com/cppp/p/40284 ...

  5. Windows消息机制-PreTranslateMessage

    PreTranslateMessage作用和使用方法 Windows消息机制的流程: A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中 B. 应用程序在消息循环中调用GetMe ...

  6. windows消息机制详解-3

    1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...

  7. 一、从Windows消息机制说起

    一,消息 消息(Message)指的就是Windows 操作系统发给应用程序的一个通知,它告诉应用程序某个特定的事件发生了.比如,用户单击鼠标或按键都会引发Windows 系统发送相应的消息.最终处理 ...

  8. 关于windows消息机制的猜想

    1. 正常情况下一个进程里面只有一个主线程而已. 主线程负责消息的读取和分析分发. 消息是保存在消息队列里面,消息队列是跟线程相关的.每一个线程都有一个消息队列(工作线程默认没有,但是随便给他发送一个 ...

  9. Windows程序运行机制

    写在前面 首先理解下两个名词: API 和 SDK. API(Application Programming Interface), 译为应用程序编程接口. 是Windows系统提供给开发人员的函数的 ...

最新文章

  1. OTP gen_server
  2. python flask 教程_Flask 教程 第一章:Hello, World!
  3. VMware静态地址上网
  4. Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略
  5. MRP信息汇总BAPI(Z_IF_MRP_TOTAL_LIST)
  6. neo4j springboot 日志_Springboot2.3集成neo4j的过程和踩坑记
  7. python 协程原理_Python协程greenlet实现原理
  8. matlab基于dct的图像压缩编码解码_音频压缩编码的基本原理详解
  9. linux怎么修改bash,Linux操作系统中如何对Bash变量内容修改?
  10. vue修改Element的el-table样式
  11. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释
  12. python机器学习库keras——CNN卷积神经网络人脸识别
  13. 怎么判断前轮左右的位置_老司机教你如何用方向盘,判断左右车轮位置,新手司机一看就会!...
  14. Oracle 客户端工具介绍
  15. [亲测]Oracle数据库约束
  16. revit二次开发概念_半天入门Revit二次开发
  17. linux下运行icem脚本,肿么安装linux版的icem
  18. 测试智商多高的软件,测测你的智商多高 国际标准智商测试30题
  19. [乐意黎转载]从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
  20. 织梦Dedecms主要文件夹目录及模板文件说明

热门文章

  1. sublime插件之sidebar
  2. Tekton系列之理论篇【二】
  3. 论文阅读_DeepWalk
  4. Java 将txt文本文档转换为excel
  5. Python 遍历文件夹下所有文件 合并txt内容
  6. 【Http】HTTP方法的安全性和幂等性
  7. web服务器服务不可用
  8. 2023最详细的接口测试用例设计教程
  9. 联想小新触控板不行了
  10. 从输入url到页面加载完成中间都发生了什么?