1、进程通信-WM_COPYDATA消息的结构体
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData; //定义的消息类型如:3003
DWORD cbData; //传输的数据长度
PVOID lpData; //传输的数据指针
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
dwData:The data to be passed to the receiving application.
cbData:The size, in bytes, of the data pointed to by the lpData member.
lpData:The data to be passed to the receiving application. This member can be NULL
备注:消息只能由SendMessage()发送,而不能使用PostMessage()。使用PostMessage()可能导致无穷等待,如果传入的接收窗口句柄无效或者当接收方进程意外终止时,SendMessage()会立即返回,PostMessage()不行。
2、进程通信-SendMessage接口结构
//需要发送的目标窗口句柄,通过FindWindow查找。
HWND hwMain= ::FindWindow(NULL, "copydataWnd");
if (hwMain== NULL)
return;
HWND hSelfMain =GetSafeHwnd();//自己当前的窗口句柄,可不传。
const char strValue = "none";
int nLen = strlen(strValue)+1; //字符串请记得把'\0'加上, 不然就错了, 这里是ANSI字符串
COPYDATASTRUCT ps;
ps.dwData = 3003;
ps.cbData = nLen;
ps.lpData = strValue ;
::SendMessage(hwMain, WM_COPYDATA, hSelfMain, (LPARAM)&ps);
3、进程通信-接收方WM_COPYDATA消息处理
i)在窗口创建的时候,注册消息回调。
WNDCLASSEX wcex;
HINSTANCE hInstance = GetUIEngine()->GetInstanceHandle();
memset(&wcex, 0, sizeof(wcex));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndCopyDataProc; //注册的消息回调
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = m_wstrWndName.c_str();
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
ii)回调消息声明。
static LRESULT CALLBACK WndCopyDataProc(
HWND hwnd, /* handle to window */
UINT uMsg, /* message identifier */
WPARAM wParam, /* first message parameter */
LPARAM lParam /* second message parameter */);
iii)在消息体里面接收消息回调
LRESULT CALLBACK CCopyDataWnd::WndCopyDataProc(
HWND hwnd, /* handle to window */
UINT uMsg, /* message identifier */
WPARAM wParam, /* first message parameter */
LPARAM lParam /* second message parameter */)
{
switch (uMsg)
{
case WM_COPYDATA:
{
COPYDATASTRUCT* pCopyDataStruct = (COPYDATASTRUCT*)lParam;
if (!pCopyDataStruct)
break;
switch (pCopyDataStruct->dwData)
{
case 3003:
{
//限定接收的数据包在1M以下。
if (pCopyDataStruct->lpData
&& pCopyDataStruct->cbData < 0x100000)
{
string strInfo((const char*)pCopyDataStruct->lpData
, pCopyDataStruct->cbData);
//处理当前消息定义的业务
}
}
}
}
}
}