1、首先是返回值意义的区别,我们先看一下MSDN里的声明:
LRESULTSendMessage(
HWNDhWnd,
UINTMsg,
WPARAMwParam,
LPARAMlParam
);
BOOLPostMessage(
HWNDhWnd,
UINTMsg,
WPARAMwParam,
LPARAMlParam
);
其中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。PostWM_QUIT时,应使用PostQuitMessage代替。
4、系统只整编(marshal)系统消息(0到WM_USER之间的消息),发送用户消息(WM_USER以上)到别的进程时,需要自己做整编。
用PostMessage、SendNotifyMessage、SendMessageCallback等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。
5、在Windows2000/XP里,每个消息队列最多只能存放10,000个Post的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Windows]USERPostMessageLimit,最小可以是4000。