利用SendMessage函数发送WM_COPYDATA消息,从而实现不同进程间传递数据。用两个应用程序,一个是用来发送消息的应用程序。一个是用来接受消息的应用程序。
发送消息的应用程序的设计:
(1)、包含两个控件:一个按钮控件和一个编辑框控件
(2)、按钮控件事件过程中,先利用FindWindow查找接受消息的应用程序,如果找到了,就用SendMesage函数发送消息。
void CDataMsgMainDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd=::FindWindow(NULL,"DataMsgClient");
if(hwnd==NULL){
AfxMessageBox("没有找到接受窗体");
return;
}
CString msgedit;
GetDlgItem(IDC_EDIT1)->GetWindowText(msgedit);
COPYDATASTRUCT data={0};
data.dwData=(DWORD)this->GetSafeHwnd();
data.cbData=msgedit.GetLength();
data.lpData=msgedit.GetBuffer(msgedit.GetLength());
::SendMessage(hwnd,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&data);
}
接受消息的应用程序的设计:
(1)、包含一个编辑框控件,用于显示接受的数据。
(2)、通过类向导天际WM_COPYDATA消息宏。编辑代码:
BOOL CDataMsgClientDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
char msgdata[256];
DWORD size= pCopyDataStruct->cbData;
CopyMemory(msgdata,pCopyDataStruct->lpData,size);
msgdata[size]='/0';
GetDlgItem(IDC_EDIT1)->SetWindowText(msgdata);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
WM_COPYDATA是能够传递数据的,其数据主要是通过COPYDATASTRUCT结构的数据来传输:
typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData;//接受数据的句柄 DWORD cbData;//数据大小 PVOID lpData;//数据指针 } COPYDATASTRUCT, *PCOPYDATASTRUCT;