PostMessage 发送消息,为何有时没有作用?

PDD123 2015-02-08 06:22:59
我用PostMessage发送ID_RefreshWin消息(自定义消息),大概有三处地方发此消息:
1.另一线程向窗口发ID_RefreshWin消息,正常
2.某一列表控件切换选中行时发ID_RefreshWin消息,没有作用,没有执行响应此消息的代码
3.点击菜单然后发送ID_RefreshWin消息,正常

请问,这是为啥?
...全文
903 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcf_reader 2015-02-24
  • 打赏
  • 举报
回复
PostMessage只管送出,不管是否送到
schlafenhamster 2015-02-09
  • 打赏
  • 举报
回复
总是 0x1931 , 可能 不是 地方。把 其他的 postmessage 注释掉 试试。
PDD123 2015-02-09
  • 打赏
  • 举报
回复
引用 3 楼 CharlesSimonyi 的回复:
用VisualStudio自带的SPY++工具抓一抓窗口上的消息看看?看看失败时,窗口有没有收到ID_RefreshWin消息。 重写CWinApp::PreTranslateMessage,在里面拦截一下ID_RefreshWin消息看看,打个断点,看看“某一列表控件切换选中行时”, ID_RefreshWin消息会不会进到PreTranslateMessage中来
确实能接收到消息。 但是不会进入PreTranslateMessage
BOOL 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);
}
oyljerry 2015-02-09
  • 打赏
  • 举报
回复
控件失去焦点,所以没有处理消息?
PDD123 2015-02-09
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
PostMessage 不保证 消息 被 接受到。 SendMessage 试试。
也许是这样。 本来想把相同的代码放到同一个地方的,但是算了,我还是在响应选中行改变的消息中处理所有事情了,不post消息了。反正响应消息的线程只有一个,不会造成访问数据冲突。
schlafenhamster 2015-02-09
  • 打赏
  • 举报
回复
PostMessage 不保证 消息 被 接受到。 SendMessage 试试。
PDD123 2015-02-09
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
1.另一线程向窗口发ID_RefreshWin消息,正常 2.某一列表控件切换选中行时发ID_RefreshWin消息,没有作用,没有执行响应此消息的代码 3.点击菜单然后发送ID_RefreshWin消息,正常 先注释掉 1,3 看看。
1是程序能运行的基础,没法注释 3是发现问题的时候用来测试才添加进去的……
schlafenhamster 2015-02-09
  • 打赏
  • 举报
回复
1.另一线程向窗口发ID_RefreshWin消息,正常 2.某一列表控件切换选中行时发ID_RefreshWin消息,没有作用,没有执行响应此消息的代码 3.点击菜单然后发送ID_RefreshWin消息,正常 先注释掉 1,3 看看。
PDD123 2015-02-09
  • 打赏
  • 举报
回复
	// TODO: 在此添加专用代码和/或调用基类
	if (pMsg->message == WM_KEYDOWN)
	{
		if (pMsg->wParam == VK_ESCAPE)
			return TRUE;
		if (pMsg->wParam == VK_RETURN)
			return TRUE;
	}
这一段是防止按esc 和 回车 退出的。屏蔽掉之后,还是没有响应ID_RefreshWin消息。
PDD123 2015-02-09
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
总是 0x1931 , 可能 不是 地方。把 其他的 postmessage 注释掉 试试。
是0x1931,对的呀,切换选中行,就发送,切换了四次.
encoderlee 2015-02-08
  • 打赏
  • 举报
回复
用VisualStudio自带的SPY++工具抓一抓窗口上的消息看看?看看失败时,窗口有没有收到ID_RefreshWin消息。 重写CWinApp::PreTranslateMessage,在里面拦截一下ID_RefreshWin消息看看,打个断点,看看“某一列表控件切换选中行时”, ID_RefreshWin消息会不会进到PreTranslateMessage中来
PDD123 2015-02-08
  • 打赏
  • 举报
回复
引用 1 楼 CharlesSimonyi 的回复:
调试一下看一看,失败的那种发送方式PostMessage的时候窗口句柄参数对不对, 对比一下点击菜单调用PostMessage时和列表控件切换选中行时调用PostMessage的窗口句柄值是不是一样的。
void CXXXDlg::PushRefreshWin(RefreshWin *r)
{
	this->EnterCriticalSection_refreshs();

	this->m_refreshs.Add(r);

	this->LeaveCriticalSection_refreshs();

	BOOL res=this->PostMessageA(ID_RefreshWin);
}
都是调用此函数,调试时PostMessageA函数都返回1
encoderlee 2015-02-08
  • 打赏
  • 举报
回复
调试一下看一看,失败的那种发送方式PostMessage的时候窗口句柄参数对不对, 对比一下点击菜单调用PostMessage时和列表控件切换选中行时调用PostMessage的窗口句柄值是不是一样的。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧