WM_COPYDATA实现delphi与VC两个程序间通信

参考了网友贴:采用copydata在vc程序间通信
我继续研究两个程序之间的通信,发现这个消息很好用,可以自己复制两个程序间的数据。虽然大批量数据会影响效率,但是也是克服采用粘贴板不足。

delphi下面程序:

TMessageContent = record

		 dwAttribute:DWORD;
     bDisplay:DWORD;
     bTrim:DWORD;
		 lpszText:array[0..99] of char;
		 lpszDescribe:array[0..99] of char;
		 lpszUrl:array[0..99] of char;
		 lpszImage:array[0..99] of char;
	end;
procedure TForm1.Button2Click(Sender: TObject);
 VAR
  //测试用例,可以从服务端获取
	 dwAttribute:DWORD;
	 isDisplay:DWORD;
	 isTrim:DWORD;
	 lpszText:string;
	 lpszDescribe:string;
	 lpszUrl:string;
	 lpszImage:string;
   	messageContent:TmessageContent;
    toastContentMessage:COPYDATASTRUCT;
    hToastWin:HWND;
 begin
    dwAttribute:= 356;
	 isDisplay:=0;
	 isTrim:= 0;
	 lpszText:= '热点';
	 lpszDescribe:= '实时新闻';
	 lpszUrl:= 'http://www.baidu.com';
	 lpszImage:= 'http://www.nipic.com/topic/show_27085_1.html';
	 messageContent.dwAttribute		:= 344;
	 messageContent.bDisplay			:= isDisplay;
	messageContent.bTrim			:= isTrim;
	strPcopy(messageContent.lpszText,lpszText);
	strPcopy(messageContent.lpszDescribe,lpszDescribe);
	strPcopy(messageContent.lpszUrl,lpszUrl);
	strPcopy(messageContent.lpszImage,lpszImage);


	toastContentMessage.lpData := @messageContent;
	toastContentMessage.cbData := sizeof(TmessageContent);

    //需要确定对方(信息接收方)的窗口名称与标题
	 hToastWin:= FindWindow('TEST','testcmu' );
	if (hToastWin = NULL) then
  begin

    exit;
	end;
	SendMessage(hToastWin, WM_COPYDATA , 0 , LongWord(@toastContentMessage));

end;

## vc下面程序:

```cpp
typedef struct __MessageContent    //要注意数据结构必须与delphi一致否则乱套
{
	DWORD dwAttribute;
	DWORD  bDisplay;
	DWORD  bTrim;
	char lpszText[100];
	char lpszDescribe[100];
	char lpszUrl[100];
	char lpszImage[100];
} MessageContent;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	//HWND hWnd = GetClipboardOwner();//获取当前剪贴板所属的窗口句柄
	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	//WM_CHANGECBCHAIN 
	case WM_COPYDATA:  //接收到信息
	{
		COPYDATASTRUCT * cdsMessageDataStruct = (COPYDATASTRUCT*)lParam;
		if (!cdsMessageDataStruct || sizeof(cdsMessageDataStruct) == 0)
			return E_FAIL;
		g_mcMessageContent = (MessageContent *)cdsMessageDataStruct->lpData;
		if(sizeof(*g_mcMessageContent) > 0 )   //有数据我就显示,先要转换为wide字符
		{
		 WCHAR wszClassName[256];
		 memset(wszClassName,0,sizeof(wszClassName));		MultiByteToWideChar(CP_ACP,0,g_mcMessageContent->lpszUrl,strlen(g_mcMessageContent->lpszUrl)+1,wszClassName,
        sizeof(wszClassName)/sizeof(wszClassName[0]));
			MessageBox(NULL,wszClassName,L"Title",MB_OK);
		}		
	}
	break;
 
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		ChangeClipboardChain(hWnd,m_hWndNextCBViewer);   
		break;
	 
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值