首先你要知道:
消息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的編輯框中
成功!