SendMessage 总是返回零?

Posted

技术标签:

【中文标题】SendMessage 总是返回零?【英文标题】:SendMessage Always returns ZERO? 【发布时间】:2010-02-20 06:55:19 【问题描述】:

为什么Windows SendMessage() 总是返回零,即使消息传递成功?有没有办法用 SendMessage() 检查消息传递失败?

编辑

忘了提到我在 c++ DLL 中使用 SendMessage()

LRESULT result = ::SendMessage(hwndOtherWindow,WM_COPYDATA, NULL/*(WPARAM)this->GetSafeHwnd()*/,(LPARAM)&structCDS);

“结果”始终为零:(,但消息成功传递到其他窗口

编辑

BOOL CDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

    return /*CDialog::OnCopyData(pWnd, pCopyDataStruct)*/ true;  //true is the trick
 

【问题讨论】:

SendMessage 返回结果取决于正在发送的消息。可以出示相关代码吗? 【参考方案1】:

对于WM_COPYDATA,SendMessage 返回零表示目标应用程序未处理该消息 (FALSE = 0)。

消息可能会成功传递,但如果目标应用程序没有正确处理消息(即错误的返回值,或将其传递给默认窗口过程),那么您的 SendMessage 调用将返回错误的结果.

如果可能的话,看看目标应用程序如何处理 WM_COPYDATA 消息可能是值得的。

【讨论】:

在接收窗口中,我简单地实现了OnCopyData方法,然后返回。如果我是正确的,接收窗口可以处理或只是忽略并返回。但是由于我的 DLL 没有窗口,所以我对这个返回结果有一个线索,我只是将 NULL 传递给 wParam。但是,SendMessage 是一个阻塞调用,它仍然应该返回正确的结果。我说的对吗? 是的,SendMessage 在处理消息时阻塞并返回窗口过程函数返回的值。如果您使用 OnCopyData (MFC?),则需要返回 TRUE 而不是零。如果您可以编辑原始帖子以在应用程序端显示您对 WM_COPYDATA 的实现,那将有很大帮助。 谢谢 mattew,正如你所说的“返回真”是诀窍,以前我只是叫“CDialog::OnCopyData”。顺便说一下,我想知道以前的实现有什么问题。 调用 CDialog::OnCopyData 有效地调用默认处理程序,它很可能返回 FALSE(即,不由应用程序处理 - “默认行为”)。如果显式返回 TRUE,则不是在调用默认处理程序,而是在实际处理消息。你可能不应该只是“返回真”;但是,作为您的实现:您可能应该正确处理消息并根据数据执行操作。

以上是关于SendMessage 总是返回零?的主要内容,如果未能解决你的问题,请参考以下文章

如何模拟后台鼠标点击功能? SendMessage 和PostMessage 都无效。

delphi如何判断RichEdit是不是显示到底部了?

Delphi的控件TScrollBox的问题,隐藏滚动条后, 这个不管用SendMessage咋办啊?? 上滚,下滚,上一页。。

窗口信息轰炸

DeflateStream.Read 总是返回零

PKPaymentAuthorizationViewController 总是返回零?