SendMessage与PostMessage

《windows核心编程》第26章详细的分析了窗口消息,让人豁然开朗。

学习小结:


1、消息队列分为Post消息队列、Send消息队列、虚拟输入消息队列和应答消息队列。

2、PostMessage是将消息发送到消息的线程队列然后返回。

3、SendMessage表面看是发送消息,等消息处理完毕后返回。实际上相对复杂一些,要分情况讨论:

1)线程内SendMessage,是直接调用窗口消息处理子过程。类似函数调用。
   
2)线程间SendMessage,消息会发送到消息处理线程的Send消息队列,发送线程等待结果。
       
a) 消息处理函数可以通过ReplyMessage()提前回应发送线程
        b)
消息循环处理消息时,Send消息队列优先于Post消息队列
        c)
调用InSendMessage()可以判定是否线程间Send过来的消息,TRUE表示线程间Send过来的消息,FALSE表示是Post过来的消息或本线程内的Send消息

写个示例在消息处理函数处打上断点,可以从堆栈窗口上看到这些过程。

1、Post消息走的是Post消息队列

2、主线程内调用SendMessage和消息处理函数是在一个栈上。

3、其他线程调用的SendMessage是发送消息到处理线程的Send消息队列,由处理线程走消息循环处理。

Send消息队列优先于Post消息队列,不能直接从堆栈看出。
可如下处理:
1)在消息响应函数中输出日志,在post消息响应中sleep个2秒。
2)在主线程连续post
5次消息,在开5个辅助线程,线程函数中连续SendMessage
5次。
查看执行结果,能看到连续的SendMessage穿插在Post之间处理。得证。

时间: 2024-12-13 23:21:20

SendMessage与PostMessage的相关文章

SendMessage、PostMessage原理

SendMessage.PostMessage原理 SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessage的运行机制. 2.SendMessage.PostMessage的运行内幕. 3.SendMessage.PostMessage的内部实现. 注:理解这篇文章之前,必须先了解Windows的消

[转] - SendMessage、PostMessage原理

SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessage的运行机制. 2.SendMessage.PostMessage的运行内幕. 3.SendMessage.PostMessage的内部实现. 注:理解这篇文章之前,必须先了解Windows的消息循环机制. 1.SendMessage.PostM

sendmessage和postmessage的区别

sendmessage和postmessage的区别PostMessage只负责将消息放到消息队列中,不确定何时及是否处理    SendMessage要等到受到消息处理的返回码(DWord类型)后才继续    PostMessage执行后马上返回    SendMessage必须等到消息被处理后才会返回. SendMessage 和 PostMessage 的区别 1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: LRESULT SendMessage(        HWND 

MFC SendMessage与PostMessage

MFC SendMessage与PostMessage flyfish 2015-2-2 PostMessage将消息放入消息队列后马上返回 SendMessage直到窗口过程处理完消息后再返回

深入解析SendMessage、PostMessage

本文将使用C++语言,在MFC框架的配合下给出PostMessage.SendMessage等的使用方式与使用不当造成的后果(讨论均针对自定义的消息进行).如有什么错误,欢迎指正. 写过Windows程序的同学都知道PostMessage.SendMessage的区别,PostMessage函数调用发送之后,立即返回,不等待消息处理完成.而SendMessage则让调用的线程处于阻塞(BLOCk)状态,直到消息处理完成. 正由于这两个函数的区别导致了如下想法: 想法1:PostMessage立即

C++技术问题总结-第10篇 MFC中SendMessage与PostMessage异同

应用程序消息有三个来源:硬件消息(鼠标键盘等外设).PostMessage消息.SendMessage消息,都可以发送消息事件来驱动程序执行. 消息流图如下. 硬件消息响应流程如下. ①消息进入系统消息队列. ②消息分发到应用程序消息队列. ③应用程序循环获取消息. ④消息处理函数执行. PostMessage直接进入上述步骤②,将消息放入消息队列中,然后立刻返回. SendMessage直接进入上述步骤④,调用消息处理函数,等待函数执行完成后返回.

PostMessage与SendMessage各自的问题

深入解析SendMessage.PostMessage 本文将使用C++语言,在MFC框架的配合下给出PostMessage.SendMessage等的使用方式与使用不当造成的后果(讨论均针对自定义的消息进行).如有什么错误,欢迎指正. 写过Windows程序的同学都知道PostMessage.SendMessage的区别,PostMessage函数调用发送之后,立即返回,不等待消息处理完成.而SendMessage则让调用的线程处于阻塞(BLOCk)状态,直到消息处理完成. 正由于这两个函数的

VB postmessage发送后台Tab

键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件.那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制. 当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机.如何区别

C#进程间通信--API传递参数(SendMessage)

注:本文为个人学习摘录,原文地址:http://blog.chinaunix.net/uid-26790551-id-3180355.html 我们不仅可以传递系统已经定义好的消息,还可以传递自定义的消息(只需要发送消息端和接收消息端对自定义的消息值统一即可).下面的发送和接收端同时演示了系统消息和自定义的消息.消息统一采用4位16进制的数. 1.系统消息使用的是0x0100(WM_KEYDOWN):0x0000--0x0400是系统自定义的消息,其中0x0000为WM_NULL,0x0400为