30-进程间通信:WM_COPYDATA(在windows下使用最多)

进程间通信:WM_COPYDATA

WM_COPYDATA

1.使用spy++获取窗口句柄

vs-工具-spy+±搜索-查找窗口-使用查找程序工具

获取窗口标题

2.FindWindow函数

将获取到的窗口标题传入FindWindow,获取对应窗口的句柄

2.SendMessage函数

获取对应句柄后,将发送的消息放入COPYDATASTRUCT结构体内,调用SendMessage将该消息发送到句柄对应的进程

LRESULT SendMessage(
HWND hWnd, //被发送的消息
UINT Msg, //消息类别
WPARAM wParam, //传递数据的窗口的句柄
LPARAM IParam //指向 COPYDATASTRUCT 结构的指针,该结构包含要传递的数据。
)

3.接收Message

在接收端,类向导里,选择WM_COPYDATA类,生成的函数中,pCopyDataStruct存储接收到的数据。该进程接受到数据立刻执行该函数。

案例

发送端

void CWMCOPYDATASENDDlg::OnBnClickedSend()
{
// 必须要知道标题 句柄
CString strWindowTitle = _T("MFCRecv");
CString strDataToSend = _T("Hello ,this is Bingo WM_COPYDATA");
//句柄
HWND hRecvWnd = ::FindWindow(NULL, strWindowTitle.GetBuffer(0));
if (hRecvWnd != NULL && ::IsWindow(hRecvWnd))
{
//数据的封装
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength() * sizeof(TCHAR);
cpd.lpData = (PVOID)strDataToSend.GetBuffer(0);
::SendMessage(hRecvWnd, WM_COPYDATA, (WPARAM)(AfxGetApp()->m_pMainWnd),(LPARAM)&cpd);
}
strDataToSend.ReleaseBuffer();
}

接收端

BOOL CWMCOPYDATADlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
//消息响应函数
//解析数据
LPCTSTR szText = (LPCTSTR)(pCopyDataStruct->lpData); //接收数据
DWORD dwLength = (DWORD)pCopyDataStruct->cbData; //数据大小
TCHAR szRecvText[1024] = { 0 };
memcpy(szRecvText, szText, dwLength);
MessageBox(szRecvText, _T("Bingo"), MB_OK);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}