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 )
|
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); }
|