您的位置:首页 > 产品设计 > UI/UE

跨进程消息以及数据发送

2014-09-10 10:24 225 查看
   跨进程消息以及数据发送

    消息机制是WINDOWS的一个特点。在WINDOWS开发中基本上都会用到消息发送以及接收,突别是对于UI界面开发这一块。进程之间相互通信的方式有很多,其中包括跨进程消息。

消息发送 最常用的是使用SendMessage以及PostMessage 系统API函数,消息发到指定的窗口。不管是进程内或进程外我们都可以通过FindWindow 得到窗口句柄。
在进程内发送消息,我们可以发送一切所有定义的消息,如系统消息,或自定的消息,并通过LPARAM或WPARAM参数传递数据。因为我们所使用的数据内存是在同一进程内。那如果不是同一个进程内,还可以通过SendMessage以及PostMessage
系统API函数的LPARAM或WPARAM 参数传递数据吗? 答案是可以的,只是不能以进程内发送消息传递数据的方式。
不管是进程内还是进程外,消息都是会发送到系统消息队列里,然后由系统消息制机分发到指定窗口的。那么有人会问为何不能以进程内发送消息传递数据的方式呢?
因为,进程内与进程外数据的内存块并非在同一个区域,消息可以发送另外一个进程,但却不能访问进程外的数据,因而不能实现数据传递。
跨进程发送数据,Windows 系统提供一个强大的消息WM_COPYDATA。WM_COPYDATA可以实现进程间传递数据,但也就仅止于WM_COPYDATA消息内处理,不能发送控件定义的消息,以及自定义的消息。WM_COPYDATA
讨论的进程间数据传递的方法,那么除了WM_COPYDATA消息外,还有什么方法可以跨进程发送消息传递数据呢?
我们可以通过VirtualAllocEx
函数。它的作用是在指定进程的虚拟空间保留或提交内存区域。下现这用这方法实现跨进程发送系统消息,传递事件数据内容。以Tab控件为例

//查找窗口句柄
HWND hWnd = ::FindWindow(NULL,_T("MFCTabTest"));
if (hWnd)

  {
//获得窗口中 TAB 控件 句柄

   HWND childHwnd = ::FindWindowEx(hWnd, NULL, WC_TABCONTROL, NULL);   

   if (childHwnd)

   {

    //TAB 跳转到第一页面,可以正常发送消息以及系统类型数据如INT,BOOL 等。

   ::SendMessage(childHwnd, TCM_SETCURSEL, 1, 0L);

    //发送 TCN_SELCHANGING 事件通知

    {

     DWORD dwProcessId; 

//获取进程ID 

     GetWindowThreadProcessId( hWnd, &dwProcessId );

//打开进程 

     HANDLEm_hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessId
);

     if (!m_hProcess)  
return ;
//获取进
a267
程分配的虚拟空间内存块

     NMHDR * pNMHDR = NULL; //写入目标进程的NMHDR 结构 

     pNMHDR = (NMHDR *)VirtualAllocEx( m_hProcess, NULL, sizeof(NMHDR), MEM_COMMIT,PAGE_READWRITE ); 

     if (!pNMHDR)  
return ;
//事件数据结构

     NMHDR mhdr;

     mhdr.hwndFrom = childHwnd;

     mhdr.code = TCN_SELCHANGING;

     mhdr.idFrom = 1000;
// 将本地进程中的结构写入到目标进程

     int nRet = WriteProcessMemory( m_hProcess, pNMHDR, &mhdr, sizeof(NMHDR), NULL ); 
//发送消息以及并传输结构数据

     ::SendMessage(hWnd,WM_NOTIFY,0,(LPARAM)pNMHDR);
//释入虚拟空间内存块
     VirtualFreeEx(m_hProcess,pNMHDR, sizeof(NMHDR),MEM_RELEASE);
    }
  }
  }

除了WM_COPYDATA外,利用虚拟空间也可以方便实现进程间数据通信。并且消息类型更完整,不管是系统消息还是自己定义的消息可以跨进程发送消息传递数据。
    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  界面 ui windows 控件