接收数据的一方
ON_WM_COPYDATA()
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
代码片段:
- BOOL CClientDemoDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
- {
- if (pCopyDataStruct != NULL)
- {
- LPCTSTR pszText = (LPCTSTR)(pCopyDataStruct->lpData);
- DWORD dwLength = (DWORD)(pCopyDataStruct->cbData);
- TCHAR szRecvText[1024] = {0};
- memcpy(szRecvText, pszText, dwLength);
- MessageBox(szRecvText, _T("Test"), MB_OK);
- }
- return CDialog::OnCopyData(pWnd, pCopyDataStruct);
- }
发送数据的一方
代码片段:
- CString strWindowTitle = _T("ClientDemo");
- CString strDataToSend = _T("Hello, Everyone fsdfsdfsdfdsfds,this is a test demo!");
- HWND hOtherWnd = ::FindWindow(NULL, strWindowTitle.GetBuffer(0));
- if (hOtherWnd != NULL && ::IsWindow(hOtherWnd))
- {
- COPYDATASTRUCT cpd;
- cpd.dwData = 0;
- cpd.cbData = strDataToSend.GetLength() * sizeof(TCHAR);
- cpd.lpData = (void*)strDataToSend.GetBuffer(0);
- HRESULT hResult = ::SendMessage(hOtherWnd, WM_COPYDATA, (WPARAM)(AfxGetApp()->m_pMainWnd), (LPARAM)&cpd);
- strDataToSend.ReleaseBuffer();
- }
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程序发送来消息了。
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程序发送来消息了。
OK了,就这么简单