我必须将一个字符串从一个进程传递到另一个进程,因此我发送带有相关信息的WM_COPYDATA
消息。接收器进程等待while
循环并休眠500毫秒,直到收到消息。
我不知道为什么它不起作用。发件人进程在SendMessage
上停止,因为接收者进程没有收到消息。当接收器上的循环由于超时而结束,并且接收者进程也结束时,发送者的SendMessage
结束并且它可以继续运行。
这是相关代码。发件人流程:
COPYDATASTRUCT cp;
memset(&cp, 0, sizeof(COPYDATASTRUCT));
cp.cbData = 128;
cp.lpData = messageStr;
cp.dwData = 45382;
::SendMessage(receiverHWND, WM_COPYDATA, (WPARAM)0, (LPARAM)&cp);
接收程序:
// Define which function runs when a message WM_COPYDATA is sent
CopyDataHandler = onCopyData;
void onCopyData(COPYDATASTRUCT *cp)
{
if (cp->lpData == NULL)
return;
if (cp->dwData == 45382) // means a message from the sender
{
strcpy(WinprocMessage, cp->lpData);
return;
}
}
BOOL OnCopyData(HWND hWnd, HWND hwndFrom, PCOPYDATASTRUCT pcds)
{
if(CopyDataHandler != NULL)
CopyDataHandler(pcds);
return TRUE;
}
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
HANDLE_MSG (hWnd, WM_COPYDATA, OnCopyData);
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
(注意有两个功能:onCopyData和OnCopyData)
现在循环的代码:
_num attempts = procTimeout * 2;
while ((attempts-- > 0) && (WinprocMessage[0] == '\0'))
Sleep(500);
那么,为什么它不起作用?是Sleep
函数阻止其他进程SendMessage
?
此外,此代码适用于其他发件人进程。 (另一个是巨大的,我不知道这一切,无法猜出存在差异的地方)也许发送者进程不得不以某种方式RegisterWindowMessage
?