使用WM_COPYDATA在进程之间发送数据

我希望在进程之间发送文本。 我发现了很多这样的例子,但没有一个我可以工作。 这是我到目前为止:

对于发送部分:

COPYDATASTRUCT CDS; CDS.dwData = 1; CDS.cbData = 8; CDS.lpData = NULL; SendMessage(hwnd, WM_COPYDATA , (WPARAM)hwnd, (LPARAM) (LPVOID) &CDS); 

接收部分:

 case WM_COPYDATA: COPYDATASTRUCT* cds = (COPYDATASTRUCT*) lParam; 

我不知道如何构buildCOPYDATASTRUCT,我只是把一些东西,似乎工作。 当debuggingWM_COPYDATA的情况下执行,但我不知道如何处理COPYDATASTRUCT。

我想在两个进程之间发送文本。

正如你可能会告诉我刚刚开始,我在Code :: Blocks中使用GNU GCC编译器,我试图避免MFC和依赖项。

有关如何使用该消息的示例,请参阅http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx 。 您也可以查看http://www.flounder.com/wm_copydata.htm

dwData成员由您定义。 把它看作是你要定义的数据类型枚举。 无论你想用什么来确定数据是一个这样一个字符串。

cbData成员是由cbData指向的数据的大小(以字节为单位)。 在你的情况下,它将是以字节为单位的字符串的大小。

lpData成员指向要复制的数据。

所以,要传输一个单一的字符串….

 LPCTSTR lpszString = ...; COPYDATASTRUCT cds; cds.dwData = 1; // can be anything cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1); cds.lpData = lpszString; SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds); 

那么,接收它….

 COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam; if (pcds->dwData == 1) { LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); // do something with lpszString... } 
 Use the following code. //Message Sender Class( for the demonstration purpose put the following code in //button click event) CString strWindowTitle= _T("InterProcessCommunicationExample"); CString dataToSend =_T("Originate from Windows"); LRESULT copyDataResult; CWnd *pOtherWnd=CWnd::FindWindowW(NULL, strWindowTitle); if(pOtherWnd) { COPYDATASTRUCT cpd; cpd.dwData=0; cpd.cbData=dataToSend.GetLength(); //cpd.cbData=_tcslen(dataToSend)+1; cpd.lpData=(void*)dataToSend.GetBuffer(cpd.cbData); AfxMessageBox((LPCTSTR)cpd.lpData); //cpd.lpData=(void*)((LPCTSTR)cpd.cbData); copyDataResult=pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM) &cpd); dataToSend.ReleaseBuffer(); } else { AfxMessageBox(L"Hwllo World"); } //Message Receiver Process BOOL CMessageReceiverClass::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { CString copiedData=(LPCTSTR)(pCopyDataStruct->lpData); AfxMessageBox((LPCTSTR)(pCopyDataStruct->lpData)); // return CDialog::OnCopyData(pWnd, pCopyDataStruct); return TRUE; } 

这不是一个真正的答案,但有用的提示时调试SendMessage(WM_COPYDATA …

那么微软的Spy ++可能真的派上用场。 你可以在这里找到它:

 c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\spyxx_amd64.exe c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\spyxx.exe 
  1. 测试它在目标进程(窗口)[ctrl + f,Windows]上的工作。
  2. WM_COPYDATA上设置第二个消息过滤器。 …和
  3. “查看\始终在上面”也是非常方便的。

快乐的C ++'ing – 特别是在C#中,API可以是真正的“乐趣”。 ;)