postmessage PostMessage和SendMessage的区别
老铁们,大家好,相信还有很多朋友对于postmessage和PostMessage和SendMessage的区别的相关问题不太懂,没关系,今天就由我来为大家分享分享postmessage以及PostMessage和SendMessage的区别的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
PostMessage和SendMessage的区别
一、主体不同
1、SendMessage:将指定的消息发送到一个或多个窗口。
2、PostMessage:是Windows API(应用程序接口)中的一个常用函数,用于将一条消息放入到消息队列中。
二、特点不同
1、SendMessage:为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。
2、PostMessage:将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。
三、规则不同
1、SendMessage:指定要接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
2、PostMessage:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。
参考资料来源:百度百科-SendMessage
参考资料来源:百度百科-PostMessage
易语言PostMessage
.版本 2
.DLL命令 SendMessage,整数型,"user32.dll","SendMessage",,如果函数调用成功,返回非零值:如果函数调用失败,返回值是零
.参数 hWnd,整数型,,其窗口程序接收消息的窗口的句柄
.参数 Msg,整数型,,指定被寄送的消息
.参数 wParam,整数型,,指定附加的消息特定的信息
.参数 IParam,整数型,,指定附加的消息特定的信息
.DLL命令 PostMessage,整数型,"user32.dll","PostMessage",,如果函数调用成功,返回非零值:如果函数调用失败,返回值是零
.参数 hWnd,整数型,,其窗口程序接收消息的窗口的句柄
.参数 Msg,整数型,,指定被寄送的消息
.参数 wParam,整数型,,指定附加的消息特定的信息
.参数 IParam,整数型,,指定附加的消息特定的信息
sendmessage和postmessage的区别
1、首先是返回值意义的区别,我们先看一下 MSDN里的声明:
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
其中 4个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32位的数,只是意义不一样),LRESULT表示的是消息被处理后的返回值,BOOL表示的是消息是不是 Post成功。
2、PostMessage是异步的,SendMessage是同步的。
PostMessage只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。
3、如果在同一个线程内,SendMessage发送消息时,由 USER32.DLL模块调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。
如果在不同线程内,SendMessage发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在 USER32.DLL模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage在返回前还做了很多工作,比如,响应别的线程向它 SendMessage。Post到别的线程时,最好用 PostThreadMessage代替 PostMessage,PostMessage的 hWnd参数可以是 NULL,等效于 PostThreadMessage+ GetCurrentThreadId。Post WM_QUIT时,应使用 PostQuitMessage代替。
4、系统只整编(marshal)系统消息(0到 WM_USER之间的消息),发送用户消息(WM_USER以上)到别的进程时,需要自己做整编。
用 PostMessage、SendNotifyMessage、SendMessageCallback等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。
5、在 Windows 2000/XP里,每个消息队列最多只能存放 10,000个 Post的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit,最小可以是 4000。
怎么使用postMessage进行通信
postMessage是window的方法,可以通过这个方法实现两个窗口之间的通信,总结下俩大概有两种类型
1.两个页面之间发送信息
2.页面向页面中的iframe发送信息
通过上边两个简单的例子可知,进行这种通信只需要简单的两个方法
第一步:分发消息,及把消息发送给相应的窗口
otherWindow.postMessage(message, targetOrigin, transfer);
otherWindow:你要发送消息给哪个窗口就是哪个窗口的引用,注意不是当前窗口,可以是iframe的窗口对象,或者是window.open返回的窗口对象。如果获取不到otherWindow是没法对相应的窗口发送信息的。
message:将要发送给otherWindow的数据。
targetOrigin:指定哪些窗口可以获取到发送的数据(可以使用“*”表示无限制)。
transfer:是一串和message同时传递的Transferable对象,可选。
第二步:监听message事件,获取另一个窗口发送给当前窗口的信息
window.addEventListener('message', function, useCapture);
message:事件类型。
function:'message'事件发生时调用的函数。
useCapture:布尔值,使用事件冒泡还是事件捕获,可选。
通过上面接单的两步就可以实现一个简单的通信
感谢您的阅读!希望本文对解决您关于postmessage和PostMessage和SendMessage的区别的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。