進程入門之sendessage(2)

 

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章