Delphi SendMessage PostMessage 原理和区别

今天用实例解释一下SendMessage PostMessage 原理和区别:

向按钮(Button)发送单击:

SendMessage:

SendMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0);

SendMessage(Button1.Handle, WM_LBUTTONUP, 0, 0);

PostMessage:

PostMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0);

PostMessage(Button1.Handle, WM_LBUTTONUP, 0, 0);

这2者都可以

但是向Edit发送字符串SendMessage可以,PostMessage就不行

Str := ‘ABC‘;

PostMessage(Edit1.Handle, WM_SETTEXT, 0, LPARAM(str)); //不行

SendMessage(Edit1.Handle, WM_SETTEXT, 0, LPARAM(str)); //行

在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可以理解为,SendMessage函数发送消息,等待消息处理完成后,SendMessage才返回。稍微深入一点,是等待窗口处理函数返回后,SendMessage就返回了。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 14:19:35

Delphi 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

HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别

HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别.当时有些紧张只是简单说了下HashMap不是线程安全的:Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁:而 ConcurrentHashMap 不仅线程安全而且效率高,因为它包含一个 segment 数组,将

WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都是用document对象模拟点击,这个方法基本能应对一般的情况,但是例如广告联盟的点击XXX就有检测机制(不多解释,你们懂的).所以完全模拟鼠标的点击事件就比较完美.于是我用了最常见的SendMessage. 接下来就要解决一个问题,webbrowser的句柄问题.从控件本身得到的句柄不是真正的浏览

交换机和路由器各自的实现原理及区别

交换机属于OSI第二层即数据链路层设备.它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行.交换是指转发和过滤帧. 路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由表路由协议产生.路由是指网络线路当中非直连的链路. 交换机最大的好处是快速,路由器最大的好处是控制能力强. 区别: ①交换是不需要IP的,而路由需要,因为IP就是第三层的协议,第二层需要的是MAC地址. ②第二层的技术和第三层的技术不一样,第二层可以做VLAN.端口捆绑等,第三层可以做N

开发程序 ip 127.0.0.0 0.0.0.0原理与区别

ip 127.0.0.1 0.0.0.0ip 地址分四个字节,每个字节有八位,及ip地址有32位,每位的数字是0-255,位与位之间用“."分开,有时ip/24,24代表24个1,表示的是子网掩码,等价于255.255.255.0.网络号是有ip和子网掩码安位与形成的,剩余的一位是本机的主机号.127.x.x.x一个特殊的ip,linux上称为localhost,习惯上称为127.0.0.1,实际上127.0.0.1到127.255.255.254之间都是等价的.正常的网络包从ip层到进入到链路

关于MySQL与SQLLite的Group By排序原理的区别

当我们对一个表的记录进行group by的时候,在未明确使用sum.min.max等聚合函数的时候,group by 的排序规则,如下对比了MYSQL和SQLLite 大家都知道,group by的时候,数据库是遍历数据库表的所有记录进行匹配处理的. 下面的SQL目的是为了查询表中groupid相同的记录中,最新时间的一条消息,给出mysql和sqllite的语句区别: MYSQL语句 SELECT * FROM( SELECT t.id,t.data_id,t.send_username,t.

如何区别PeekMessage&GetMessage SendMessage&PostMessage

转自http://blog.csdn.net/young0325/article/details/6430664 Peekmessage和Getmessage都是向系统的消息队列中取得消息,不过性质不同. 若第一次向消息队列中取不到消息,则程序的主线程会被OS(操作系统)挂起;等到OS重新调度到该线程时,而且消息队列仍然是空的时,两者的性质不同: 若使用Getmessage(),则程序的主线程会仍被OS挂起. 若是用Peekmessage(),则程序会取得OS控制权,运行一段时间.此函数多用于处

Android Serializable与Parcelable原理与区别

一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程.对象的反序列化:把字节序列恢复为Java对象的过程. (2) 序列化详细解释 对象的序列化涉及三个点关键点:Java对象.字节序列.存储. 1. Java对象的组成?Java对象包含变量与方法.但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理. 2. 什么是字符序列?字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个