PostMessage 发送消息,为何有时没有作用? 调试一下看一看,失败的那种发送方式PostMessage的时候窗口句柄参数对不对,对比一下点击菜单调用PostMessage时和列表控件切换选中行时调用PostMessage的窗口句柄值是不是一样的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CXXXDlg::PushRefreshWin(RefreshWin *r){ this->EnterCriticalSection_refreshs(); this->m_refreshs.Add(r); this->LeaveCriticalSection_refreshs(); BOOL res=this->PostMessageA(ID_RefreshWin);}都是调用此函数,调试时PostMessageA函数都返回1 用VisualStudio自带的SPY++工具抓一抓窗口上的消息看看?看看失败时,窗口有没有收到ID_RefreshWin消息。重写CWinApp::PreTranslateMessage,在里面拦截一下ID_RefreshWin消息看看,打个断点,看看“某一列表控件切换选中行时”,ID_RefreshWin消息会不会进到PreTranslateMessage中来 确实能接收到消息。但是不会进入PreTranslateMessageBOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){ // TODO: 在此添加专用代码和/或调用基类 if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_ESCAPE) return TRUE; if (pMsg->wParam == VK_RETURN) return TRUE; } else if(pMsg->message==ID_RefreshWin) { CArray<RefreshWin * > arr; this->EnterCriticalSection_refreshs(); for(int i=0,count=this->m_refreshs.GetSize();i<count;i++) arr.Add(this->m_refreshs[i]); this->m_refreshs.RemoveAll(); this->LeaveCriticalSection_refreshs(); for(int i=0,count=arr.GetSize();i<count;i++) { arr[i]->Refresh(*this); delete arr[i]; } } return CDialog::PreTranslateMessage(pMsg);} 总是 0x1931 , 可能 不是 地方。把 其他的 postmessage 注释掉 试试。 // TODO: 在此添加专用代码和/或调用基类 if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_ESCAPE) return TRUE; if (pMsg->wParam == VK_RETURN) return TRUE; }这一段是防止按esc 和 回车 退出的。屏蔽掉之后,还是没有响应ID_RefreshWin消息。 1.另一线程向窗口发ID_RefreshWin消息,正常2.某一列表控件切换选中行时发ID_RefreshWin消息,没有作用,没有执行响应此消息的代码3.点击菜单然后发送ID_RefreshWin消息,正常先注释掉 1,3 看看。 PostMessage 不保证 消息 被 接受到。SendMessage 试试。 也许是这样。本来想把相同的代码放到同一个地方的,但是算了,我还是在响应选中行改变的消息中处理所有事情了,不post消息了。反正响应消息的线程只有一个,不会造成访问数据冲突。 PostMessage只管送出,不管是否送到 CStdioFile打开绝对路径名的问题 关于对话框 模拟 怎样将一段内存中的HTML在CHtmlView中显示出来? 如何取一个单文档的某个区域(保存成图)? 数据收到,warfare来拿分 MFC怎么指定窗口类的名称? 二叉树的生成 没招了:error C2065: 'CoCreateInstanceEx' : undeclared identifier OpenCV读取16位的tif图像 cvLoadImage总是自动转换成8位。。T__T 现在做什么工作工资高 c++还行么 求一段基于MFC高通滤波器程序,主要是想实现滤除波形的基线漂移
{
this->EnterCriticalSection_refreshs(); this->m_refreshs.Add(r); this->LeaveCriticalSection_refreshs(); BOOL res=this->PostMessageA(ID_RefreshWin);
}
都是调用此函数,调试时PostMessageA函数都返回1
重写CWinApp::PreTranslateMessage,在里面拦截一下ID_RefreshWin消息看看,打个断点,看看“某一列表控件切换选中行时”,
ID_RefreshWin消息会不会进到PreTranslateMessage中来
但是不会进入PreTranslateMessageBOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_ESCAPE)
return TRUE;
if (pMsg->wParam == VK_RETURN)
return TRUE;
}
else if(pMsg->message==ID_RefreshWin)
{
CArray<RefreshWin * > arr;
this->EnterCriticalSection_refreshs(); for(int i=0,count=this->m_refreshs.GetSize();i<count;i++)
arr.Add(this->m_refreshs[i]);
this->m_refreshs.RemoveAll(); this->LeaveCriticalSection_refreshs(); for(int i=0,count=arr.GetSize();i<count;i++)
{
arr[i]->Refresh(*this);
delete arr[i];
}
}
return CDialog::PreTranslateMessage(pMsg);
}
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_ESCAPE)
return TRUE;
if (pMsg->wParam == VK_RETURN)
return TRUE;
}
这一段是防止按esc 和 回车 退出的。屏蔽掉之后,还是没有响应ID_RefreshWin消息。
2.某一列表控件切换选中行时发ID_RefreshWin消息,没有作用,没有执行响应此消息的代码
3.点击菜单然后发送ID_RefreshWin消息,正常
先注释掉 1,3 看看。
也许是这样。
本来想把相同的代码放到同一个地方的,但是算了,我还是在响应选中行改变的消息中处理所有事情了,不post消息了。反正响应消息的线程只有一个,不会造成访问数据冲突。