跨进程消息以及数据发送
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外,利用虚拟空间也可以方便实现进程间数据通信。并且消息类型更完整,不管是系统消息还是自己定义的消息可以跨进程发送消息传递数据。
消息机制是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外,利用虚拟空间也可以方便实现进程间数据通信。并且消息类型更完整,不管是系统消息还是自己定义的消息可以跨进程发送消息传递数据。
相关文章推荐
- QT中用udp客户端发送消息,丢失数据的情况以及处理!
- MFC 不同进程间的消息通信与数据(字符串)发送
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- 通过消息跨进程发送与接收 TCopyDataStruct 数据 - 回复 "skymesh"
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- 跨进程发送消息数据(发送WM_COPYDATA消息,够简单的)
- 进程间的通信以及发送消息
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- 通过消息跨进程发送与接收 TCopyDataStruct 数据 - 回复 "skymesh"
- 跨进程发送消息数据
- C#+JS简单实现 定时轮询数据表 以及时弹出消息提示窗口
- 发送和接收数据消息
- [转]如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 发送数据消息
- 发送数据消息
- 服务消息、业务实体以及数据实体
- VC 进程间通讯发送自符串消息
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 发送HTTP数据流以及HTTPS数据流