首先你要知道:
消息WM_COPYDATA的作用为:
当应用程序将数据传递到另一个应用程序时,将发送此消息。
句法:
WM_COPYDATA wParam = (WPARAM)(HWND) hwnd;
lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;参数:
- hwnd
处理传递数据的窗口。
- pcds
指向包含要传递的数据的COPYDATASTRUCT结构的指针。返回值:
如果接收方应用程序处理了此消息,则应返回TRUE;否则,返回TRUE。否则,应返回FALSE。
注意:
应用程序必须使用SendMessage函数发送此消息,而不是PostMessage函数。
传递的数据不得包含指向接收数据的应用程序不可访问的对象的指针或其他引用。
发送此消息时,发送过程的另一个线程不得更改引用的数据。
接收应用程序应将数据视为只读。在个人通讯装置参数仅该消息的处理过程中是有效的。接收应用程序不应释放pcds引用的内存。如果接收应用程序必须在SendMessage返回后访问数据,则必须将数据复制到本地缓冲区中
其中COPYDATASTRUCT的结构
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
dwData
类型:ULONG_PTR
要传递给接收应用程序的数据。
cbData
类型:DWORD
lpData成员指向的数据的大小(以字节为单位)。
lpData
类型:PVOID
要传递给接收应用程序的数据。该成员可以为NULL。
一个例子:
首先我是在第一个应用程序中拖拽了一个Edit和一个Button控件,实现在文本编辑框内输入字符串,点击按钮发送到另一个应用程序的对话框内(第一个应用程序叫mfctest1,第二个叫mfctest2)
在mfctest1中实现:
其中Edit的ID为IDC_SENDSTR
按钮的响应函数内代码:
LRESULT copyData; //copyDataResult has value returned by other app
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "mfctest2");
CString strData;
GetDlgItemText(IDC_SENDSTR,strData);
if (pOtherWnd)
{
COPYDATASTRUCT cpd; //上面提到的结构体
cpd.dwData = 0;
cpd.cbData = strData.GetLength()+sizeof(wchar_t); //sizeof(wchar_t)指 \0 的长度。
cpd.lpData = (void*)strData.GetBuffer(cpd.cbData);
copyData= pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
strData.ReleaseBuffer();
}
else
{
AfxMessageBox("未找到");
}
在mfctest2中实现:
拖拽一个Edit编辑框,ID为:IDC_RecvStr;
先给窗口添加WM_COPYDATA消息函数,然后在函数中添加成如下:
在VC++6.0中是右击CMfctest2Dlg(我这里的窗口名叫“mfctest2”),再点击ADD Windows Message Handler...,找到WM_COPYDATA消息,添加。
在VS中是右击CMfctest2Dlg点击属性,上面有一个消息的图标,点击,找到WM_COPYDATA,add
函数实现:
BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString strRec = (LPCSTR) (pCopyDataStruct->lpData);
SetDlgItemText(IDC_RecvStr,strRec);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}
全部编译完成,并运行(注意两个程序都要运行,不然找不到接受方的对话框)
在mfctest1的编辑框中输入“123456789”,点击发送
“123456789”出现在mfctest2的编辑框中
成功!