为什么用SendMessage发WM_COPYDATA消息无效呢?

cloudboy 2006-03-17 11:33:31
我的2个程序需要通信, 其中发消息的这样写:

HWND h = FindWindow(0,"mytest");
SendMessage(h,WM_COPYDATA,0,0);


另一个受消息的这样写:

void __fastcall TForm1::ApplicationEventsMessage(tagMSG &Msg,
bool &Handled)
{
if(Msg.message == WM_COPYDATA)
ShowMessage("Get OK!");
}

怎么但是接受程序一直收不到消息?
...全文
930 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2006-03-17
  • 打赏
  • 举报
回复
使用WM_COPYDATA:

CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength();
cpd.pData = (void*)str.GetBuffer(cpd.cbData);
SendMessage( hWndReceived, WM_COPYDATA, 0, (LPARAM) & cpd );
str.ReleaseBuffer();

加入映射宏:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)
...
ON_WM_COPYDATA()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
映射函数:
BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
   CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
   return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}

//估计你没有添加WM_COPYDATA消息映射宏
一个傻冒 2006-03-17
  • 打赏
  • 举报
回复
FindWindow寻找窗口列表中第一个符合指定条件的顶级窗口.
如果不是前台的话,句柄找不到.
zigzeg 2006-03-17
  • 打赏
  • 举报
回复
第4个参数一般添啥 ?
cloudboy 2006-03-17
  • 打赏
  • 举报
回复
我知道了,原来是sendmessage 要填第4个参数才能发出!

另外,为什么接受窗体一定要在前台才能收到消息呢?
striking 2006-03-17
  • 打赏
  • 举报
回复
确定FindWindow 没有返回0?
syy64 2006-03-17
  • 打赏
  • 举报
回复

CWnd::PreTranslateMessage
virtual BOOL PreTranslateMessage( MSG* pMsg );

的响应函数里试试。
cloudboy 2006-03-17
  • 打赏
  • 举报
回复
哈哈,我知道是什么回事了,原来是窗口有重名!!! nnd。揭帖!
一个傻冒 2006-03-17
  • 打赏
  • 举报
回复
MSDN中关于发送WM_COPYDATA消息有这样一句话
An application must use the SendMessage function to send this message, not the PostMessage function.

Snow_Ice11111 2006-03-17
  • 打赏
  • 举报
回复
太快了,加错地方了,改:
HWND hwnd=::FindWindow(NULL,"Receive"); //假设目标程序窗口标题为"Receive"
if (hwnd)
{
CWnd::FromHandle(hwnd)->SetForegroundWindow(); //再加这一行试试
::PostMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA);
}
else
AfxMessageBox("目标程序没有运行。");
Snow_Ice11111 2006-03-17
  • 打赏
  • 举报
回复
这个我没试过,你可以把SendMessage改为PostMessage试一下,还不行的话把再在前面加上一行:
HWND hwnd=::FindWindow(NULL,"Receive"); //假设目标程序窗口标题为"Receive"
CWnd::FromHandle(hwnd)->SetForegroundWindow(); //再加这一行试试
if (hwnd)
::PostMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA);
else
AfxMessageBox("目标程序没有运行。");
cloudboy 2006-03-17
  • 打赏
  • 举报
回复
按照上面的办法作了, 可以接受。

但是现在的问题是为什么 接受窗体 最小化后就收不到了呢? findwindow可以找到的。
Snow_Ice11111 2006-03-17
  • 打赏
  • 举报
回复
下面是很早以前我自己写的心得,供你参考一下:
1 发送消息的程序中比较简单,在要发送的地方加入如下代码就行了:
void CSendDlg::OnSend()
{
// TODO: Add your control notification handler code here

CString str="这是我要发送的给另外一个进程字符串。";
COPYDATASTRUCT myCopyDATA;
myCopyDATA.cbData=str.GetLength();
myCopyDATA.lpData=str.GetBuffer(0);
str.ReleaseBuffer();
HWND hwnd=::FindWindow(NULL,"Receive"); //假设目标程序窗口标题为"Receive"
if (hwnd)
::SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA);
else
AfxMessageBox("目标程序没有运行。");

}
2 接收消息的程序(这里假设是基于对话框的工程)请按如下步骤来实现:
先给对话框类CReceiveDlg(如果你的接收程序为SDI工程的话,把CReceiveDlg类换成CMainFrame类)添加一个消息处理函数LRESULT OnReceive(WPARAM wParam,LPARAM lParam),代码如下:
LRESULT CReceiveDlg::OnReceive(WPARAM wParam,LPARAM lParam)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;
CString strTemp;
memcpy(strTemp.GetBuffer((int)p->cbData),p->lpData,p->cbData);
strTemp.ReleaseBuffer();
AfxMessageBox(strTemp);
return 0;
}
接着再给工程设定刚才添加的函数OnReceive为WM_COPYDATA消息的响应函数,在ReceiveDlg.cpp文件中如下地方加入一行代码:
BEGIN_MESSAGE_MAP(CReceiveDlg, CDialog)
//{{AFX_MSG_MAP(CReceiveDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_COPYDATA,OnReceive) //只要添加这一行进行WM_COPYDATA消息映射
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


好了,现在分别运行两个程序,应该可以在A程序中给B程序发送消息了,B收到消息后会弹出个MessageBox来显示从A程序发送来消息了。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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