示例验证PostMessage和SendMessage的区别

 我来答
就烦条0o
2016-05-10 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
首先简单描述一下PostMessage和SendMessage的区别,让大家有个概念。
PostMessage:只是将消息放入到消息队列中,不管是否执行都返回。
SendMessage:将消息放入到消息队列中,并立即执行返回结果。
下面开始做一个基于对话框的MFC示例:
1)创建工程,并在对话框中插入一个STATIC控件,关联变量名m_staticPrompt
2)在对话框头文件中声明函数:
afx_msg LRESULT OnRefreshPrompt(WPARAM wPara,LPARAM lPara);//目的是接受到消息后,进行响应
3)在对话框头文件中定义一个自定义消息宏名称
#define WM_REFRESH WM_USER+1
4)在对话框源文件中添加消息映射
BEGIN_MESSAGE_MAP(CTestPostMsgDlg, CDialog)
...
ON_MESSAGE(WM_REFRESH, &CTestPostMsgDlg::OnRefreshPrompt)
...
END_MESSAGE_MAP()
5)在对话框源文件中写入如下代码:
//执行WM_REFRESH消息响应
LRESULT CTestPostMsgDlg::OnRefreshPrompt(WPARAMwPara,LPARAM lPara)
{
CString* str = (CString*)lPara;
if(str->Compare(_T("POST"))==0)
m_staPrompt.SetWindowText(_T("接受到传递的消息"));
UpdateData(FALSE);
//
return TRUE;
}

//
void CTestPostMsgDlg::OnBnClickedOk()
{
//第一步传递普通的消息看看区别
//如果调试以下两句代码,您会发现:先退出后更新
// PostMessage(WM_REFRESH);
// SendMessage(WM_CLOSE);
//如果调试以下两句代码,您会发现:先更新后退出
// PostMessage(WM_CLOSE);
// SendMessage(WM_REFRESH);

//第二步一个带字符串的消息看看效果
CString* strTemp = new CString("POST");
//如果使用PostMessage传递,您会发现:字符串已经析构了才执行消息响应,这样会造成死机
// PostMessage(WM_REFRESH,0,(LPARAM)strTemp);
//如果使用SendMessage传递,您会发现:显示正常
SendMessage(WM_REFRESH,0,(LPARAM)strTemp);
delete strTemp;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式