参考: http://pppboy.blog.163.com/blog/static/3020379620101026103644889/
进程入门之sendessage(1) 里提到了一个win32 的API,SendMessage,它有4个参数如下。
SendMessage函数的原型为
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息
WPARAM 和 LPARAM 两个附加参数,可以传递一些附加信息,由于它们是long 型的,所以只能传递数字,如果想要传递字符串之类的则需要使用指针,即字符串的地址。
但是并不只有上面这种发送消息的API,CWnd 类也有成员函数 SendMessage,而且只有3个参数,如下:SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );下面的示例中使用的是CWnd 类的成员函数 SendMessage来进行发送消息的。
一、使用WM_COPYDATA消息在不同进程发送消息传递字符串
发送WM_COPYDATA消息在进程间传送数据,WM_COPYDATA 是系统消息。不同于进程入门之sendessage(1)中的自定义消息。WM_COPYDATA结合sendmessag
来完成进程间字符串的发送。
(1)发送消息
The exchange of data is performed by finding the other application (using FindWindow) and sending a WM_COPYDATA message to that window
使用FindWindow找到窗口,然后发送WM_COPYDATA消息,字符串附加到COPYDATASTRUCT 结构体
LRESULT copyDataResult;CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle);if (pOtherWnd)
{COPYDATASTRUCT cpd;cpd.dwData = 0;cpd.cbData = strDataToSend.GetLength();cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);strDataToSend.ReleaseBuffer();// copyDataResult has value returned by other app
}else
{AfxMessageBox("Unable to find other app.");
}
(2)添加消息
The other app should handle the WM_COPYDATA message in the following manner
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)//{{AFX_MSG_MAP(CMyWnd)
...ON_WM_COPYDATA()...//}}AFX_MSG_MAP
END_MESSAGE_MAP()
(3)消息处理
BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct){CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}
二、备注说明
如果有4个参数的SendMessage,调用如下:
::SendMessage(hWnd->GetSafeHwnd(),WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!
其中hWnd 是接受窗口的句柄。