參考: 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 是接受窗口的句柄。