一、首先是返回值意义的区别,咱们先看一下 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 成功。
二、PostMessage 是异步的,SendMessage 是同步的。
PostMessage 只把消息放入队列,无论消息是否被处理就返回,消息可能不被处理;而 SendMessage 等 待消息被处理完了以后才返回,若是消息不被处理,发送消息的线程将一直被阻塞。
三、若是在同一个线程内,SendMessage 发送消息时,由 USER32.DLL 模块调用目标窗口的消息处理程 序,并将结果返回。SendMessage 在同一线程中发送消息并不入线程消息队列。PostMessage 发送消息 时,消息要先放入线程的消息队列,而后经过消息循环分派到目标窗口(DispatchMessage)。
若是在不一样线程内,SendMessage 发送消息到目标窗口所属线程的消息队列,而后发送消息的线程在 USER32.DLL 模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage 在返回前还作了不少工做,好比,响应别的线程向它 SendMessage。Post 到别的线程时,最好用 PostThreadMessage 代替 PostMessage,PostMessage 的 hWnd 参数能够是 NULL,等效于 PostThreadMessage + GetCurrentThreadId。Post WM_QUIT 时,应使用 PostQuitMessage 代替。
四、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,须要本身作整编。
用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可使用指针,由于发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。
五、在 Windows 2000/XP 里,每一个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将 不会被处理,直接丢掉。这个值能够改得更大: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit,最小能够是 4000。异步