WM_COPYDATA消息
对Sever端的Send按钮做如下操作:
void CSeverDlg::OnButtonClickSend()
{
COPYDATASTRUCT cCopyData;
cCopyData.cbData = m_Input.GetWindowTextLength();
CString Tmp;
m_Input.GetWindowText(Tmp);
cCopyData.lpData = Tmp.GetBuffer(0);
cCopyData.dwData = 0;
//use a event to make sure data have been sended
//Find the target window
HWND hDestWnd = (HWND)::FindWindow(NULL, "My-Client");
//Send WM_COPYDATA message to transmit infomation
::SendMessageTimeout(hDestWnd, //目标窗口
WM_COPYDATA, //消息
(WPARAM)AfxGetMainWnd()->m_hWnd, //发送消息的窗口
(LPARAM)&cCopyData, //COPYDATASTRUCT结构
SMTO_ABORTIFHUNG, //超时立即返回
1000, //超时一秒
NULL);
//::SendMessage(hDestWnd, WM_COPYDATA, (WPARAM)(AfxGetApp()->m_pMainWnd), (LPARAM)&cCopyData);
DWORD dwError = GetLastError();
CloseHandle(hDestWnd);
}
我在这里卡了半天,原因是::命名空间作用域域符没有加,导致使用了CWin类的FindWindow()成员函数,得到的是CWnd对象,强制转为HWND之后就捕捉到了1400:无效的窗口句柄。 …………很明显,一个是对象,一个是句柄,完全两码事……
COPYDATASTRUCT结构体定义:
typedef struct tagCOPYDATASTRUCT{
DWORDdwData;//自定义的行动代码
DWORDcbData;//lpData内容的大小
PVOIDlpData;//指向共享的数据指针
};
Client端:
//对OnCopyData函数进行重载即可
BOOL CClientDlg::OnCopyData(CWnd *pWnd, COPYDATASTRUCT* cds)
{
if (cds->cbData)
{
m_Input.SetWindowText((LPCTSTR)cds->lpData);
}
return CDialog::OnCopyData(pWnd,cds);
}
很喜欢编程,喜欢深入了解一切的实现,作为新人,希望前辈们多多指正,多多鼓励,谢谢。