Window:进程通信-WM_COPYDATA消息

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);
						//处理当前消息定义的业务
					}	
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾荒的小海螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值