SendMessage和PostMessage这两个函数消息的区别是:
返回值类型不同:两个函数的4个参数的意义是一样的,只有返回值类型不同(其实从数据上看他们一样是一个32位的数,只是意义不一样);
SendMessage的返回值类型是LRESULT:表示的是消息被处理后的返回值;
PostMessage的返回值类型是BOOL:表示的是消息是不是传递成功。
PostMessage是异步的,SendMessage是同步的。
PostMessage只把消息放入窗口消息队列中,不管消息被处理后的结果就返回;
而SendMessage等待消息被处理完了之后才返回。
如果在同一个线程内,常常使用SendMessage发送消息时,速度快并能得到返回的消息处理结果。在不同线程或者进程之间,一般使用PostMessage发送消息,把消息先放入目标窗口的消息队列中,然后由目标窗口通过消息循环自行派发处理。
代码如下:
enum {UM_TEST = WM_USER + 222};//添加自定义消息
/*PostMessage 和 SendMessage区别*/
void CMFCjisuanDlg::OnBnClickedButton1()//SendMessage
{
/*SendMessage(WM_CLOSE);*/
LRESULT nRes = SendMessage(UM_TEST, 10000. - 888);
}
void CMFCjisuanDlg::OnBnClickedButton2()//PostMessage
{
/*PostMessage(WM_CLOSE);*/
BOOL b = PostMessage(UM_TEST, 10000. - 888);
}
void CMFCjisuanDlg::OnClose()
{
if (AfxMessageBox(_T("确定需要退出吗?"), MB_YESNO | MB_ICONQUESTION) == IDYES)
CDialogEx::OnClose();
}
/*自定义消息*/
afx_msg LRESULT CMFCjisuanDlg::OnUmText(WPARAM wParam, LPARAM lParam)
{
Sleep(1000 * 2);
return wParam + lParam;
}
具体效果如何,大家可以通过以上创建两个按钮,再创建一个UM_TEST消息函数,然后用SendMessage和PostMessage函数进行回调消息函数,再断点调试即可看到效果。