进程入门之sendessage(2)

来源:互联网 发布:淘宝法务部电话 编辑:程序博客网 时间:2024/05/22 04:34

 

 

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

0 0