参考了网友贴:采用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;
}