本文讲解SendMessage、PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级、中级、高级程序员进行理解,三个步骤分别为:

1、SendMessage、PostMessage的运行机制。

2、SendMessage、PostMessage的运行内幕。

注:理解这篇文章之前,必须先了解Windows的消息循环机制。

1、SendMessage、PostMessage的运行机制

我们先来看最简单的。

SendMessage可以理解为,SendMessage函数发送消息,等待消息处理完成后,SendMessage才返回。稍微深入一点,是等待窗口处理函数返回后,SendMessage就返回了。

PostMessage可以理解为,PostMessage函数发送消息,不等待消息处理完成,立刻返回。稍微深入一点,PostMessage只管发送消息,消息有没有被送到则并不关心,只要发送了消息,便立刻返回。

对于写一般Windows程序的程序员来说,能够这样理解也就足够了。但SendMessage、PostMessage真的是一个发送消息等待、一个发送消息不等待吗?具体细节,下面第2点将会讲到。

2、SendMessage、PostMessage的运行内幕

在写一般Windows程序时,如上第1点讲到的足以应付,其实我们可以看看MSDN来确定SendMessage、PostMessage的运行内幕。

在MSDN中,SendMessage解释如为:The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

翻译成中文为:SendMessage函数将指定的消息发到窗口。它调用特定窗口的窗口处理函数,并且不会立即返回,直到窗口处理函数处理了这个消息。

再看看PostMessage的解释:The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

翻译成中文为:PostMessage函数将一个消息放入与创建这个窗口的消息队列相关的线程中,并立刻返回不等待线程处理消息。

仔细看完MSDN解释,我们了解到,SendMessage的确是发送消息,然后等待处理完成返回,但发送消息的方法为直接调用消息处理函数(即WndProc函数),按照函数调用规则,肯定会等消息处理函数返回之后,SendMessage才返回。而PostMessage却没有发送消息,PostMessage是将消息放入消息队列中,然后立刻返回,至于消息何时被处理,PostMessage完全不知道,此时只有消息循环知道被PostMessage的消息何时被处理了。

至此我们拨开了一层疑云,原来SendMessage只是调用我们的消息处理函数,PostMessage只是将消息放到消息队列中。下一节将会更深入这两个函数,看看Microsoft究竟是如何实现这两个函数的。

原文链接

SendMessage、PostMessage 2021-01-07相关推荐

  1. SendMessage、PostMessage原理

    SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别 ...

  2. SendMessage、PostMessage原理和源代码详解

    本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...

  3. 0基础快速入门CSS技术栈(5)—图解详细阐述说透CSS的盒子模型(超级重要)、圆角边框、盒子阴影及相关重要的笔试题——css的核心中的核心(附详细案例源码解析过程)2021.01.07更新

    文章目录 1. 盒子模型(CSS重点) 1.1 看透网页布局的本质 1.2 盒子模型(Box Model) 1.3 盒子边框(border) 1.3.1 边框综合设置 1.3.2 example01 ...

  4. STM32学习笔记2021/01/07

    关于stm32的寄存器 引言 STM32F103ZET6共有144个引脚,共有7组每组16个共计112个I/O端口:每个GPIO端口有两个32bit的配置寄存器(GPIOx_CRL,GPIOx_CRH ...

  5. java sendmessage_SendMessage、PostMessage原理和源代码详解

    本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...

  6. 468、Java框架122 -【Spring + SpringMVC + MyBatis - JSON】 2021.01.27

    目录 0.本知识点效果 1.jquery.min.js 2.json中文问题 3.CategoryController 4.submit.html 5.getOne.html 6.getMany.ht ...

  7. SendMessage和PostMessage

    SendMessage 和 PostMessage 的区别 1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: LRESULT SendMessage(         HWND hWnd ...

  8. 2019.01.07|区块链技术头条

    2019.01.07|区块链技术头条 1.科普 | 深处的蚁穴:与 Gas 相关的三种安全问题 2.科普 | OmiseGo 将如何把 Plasma 带入寻常百姓家 3.干货 | 详解 MimbleW ...

  9. SendMessage 和 PostMessage

    Win32 API消息函数:SendMessage 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回.而函数PostMessage不同, ...

最新文章

  1. String s1==s2面试题
  2. aptitude_PHP Numbers Aptitude问题与解答
  3. 欧姆龙变频器MX2参数_第442期丨【源程序】基于三菱西门子欧姆龙松下PLC实现喷水池控制系统;欧姆龙PLC编程软件更新步骤...
  4. Bailian2766 最大子矩阵【最大子段和+DP】
  5. PTA: 6-5 删除单链表偶数节点 (20 分)
  6. 镜头像差之二——色差
  7. ubuntu下NS2+leach算法安装笔记(1)
  8. matlab 电磁场与电磁波,MATLAB在电磁场与电磁波课程教学中的应用
  9. 品质qc工程图_QC工程图-(品管)
  10. rog live service是什么_「评测」三模无线,微动随心换,华硕ROG 烈刃2满足所有游戏需求...
  11. 顶级摄影师的磨皮美白利器Portraiture,支持搭配微设证件大师使用
  12. U盘文件变exe文件
  13. CentOS利用WebHook实现PHP自动部署Git代码
  14. 修改 植物大战僵尸 存档信息
  15. 威5创非凡,领航再出击 | 新华三集团成立五周年庆
  16. 统计建模与R软件-第六章 回归分析
  17. 基于Java毕业设计弹幕视频网站源码+系统+mysql+lw文档+部署软件
  18. 易友八字合婚系统发布(支持同性基友拉拉兼容)1.01发布
  19. 智能机器人与智能系统(大连理工大学庄严教授)——3.工业机器人
  20. itx 主板支持服务器内存,华擎造了块有4条DDR4内存插槽的ITX主板出来,还板载4核CPU...

热门文章

  1. 用SnowNLP().sentiments报错
  2. 微信小程序-动态设置图片的高度
  3. leetcode 2256. 最小平均差
  4. 瑞萨单片机之开发环境的搭建(一)
  5. c语言编程彩虹桥,语言彩虹桥教案
  6. SAP WM 入库策略-固定仓位
  7. Redis与本地缓存组合食用,味道更佳!
  8. 八爪鱼在融媒体中的应用
  9. 组件、子系统、包区别联系
  10. 德国计算机领域的名人,这些中德名人竟是校友!盘点那些有名的留德大咖和他们的德国校友...