MFC-进程间消息传递

在涉及到将一个进程的信息发送到另一个进程的消息,并让另一个进行消息处理,通常需要涉及到进程间通讯。

  1. 分别在两个进程间定义消息;
  2. 在要接受的进程间定义消息映射;
  3. 在发送消息的进程进行消息触发;

在进行发送消息的进程首先获取到接受进程的句柄,通过定义的消息进行发送消息,在接受进程定义对应的消息映射;

在发送进程定义消息:
#define MESS_1 WM_USER + 111
#define MESS_2 WM_USER + 112
#define MESS_3 WM_USER + 113
#define MESS_4 WM_USER + 114
#define MESS_5 WM_USER + 115
#define MESS_6 WM_USER + 116
#define MESS_7 WM_USER + 117

在发送进程获取接受进程的句柄:

HWND m_hAdaptorWnd = NULL;
CString strfilename(buf); 
strfilename.Append( _T("Driver\\HM_UDMGenTest.exe"));
WinExec(strfilename,SW_HIDE);

CString  str = _T("打标软件DEMO"); //要查找的窗体名称
m_hAdaptorWnd = FindWindow(NULL,str);
ShowWindow(m_hAdaptorWnd,SW_HIDE);
if(!m_hAdaptorWnd)
{ 
		CDebug::ShowDetailMessage("HM_UDMGenTest do not start!");
}

在发送进程进行消息传递:

	::SendMessage(m_hAdaptorWnd,MESS_1,(WPARAM)0,(LPARAM)0);
	::SendMessage(m_hAdaptorWnd,MESS_2,(WPARAM)0,(LPARAM)0);
	::SendMessage(m_hAdaptorWnd,MESS_3,(WPARAM)0,(LPARAM)0);
	::SendMessage(m_hAdaptorWnd,MESS_4,(WPARAM)0,(LPARAM)0);
	::SendMessage(m_hAdaptorWnd,MESS_5,(WPARAM)0,(LPARAM)0);
	::SendMessage(m_hAdaptorWnd,MESS_6,(WPARAM)0,(LPARAM)0);
	::SendMessage(m_hAdaptorWnd,MESS_7,(WPARAM)0,(LPARAM)0);

在接受进程中定义进程:

#define MESS_1		    WM_USER + 111
#define MESS_2	        WM_USER + 112
#define MESS_3			WM_USER + 113
#define MESS_4			WM_USER + 114
#define MESS_5			WM_USER + 115
#define MESS_6			WM_USER + 116
#define MESS_7			WM_USER + 117

在接受进程中定义消息映射:

在头文件中定义进行声明:
DECLARE_MESSAGE_MAP()
XXX1
XXX2
XXX3
XXX4
XXX5
XXX6
XXX7
在对应的.cpp文件实现:

BEGIN_MESSAGE_MAP(ClassName,BasedName)
	ON_MESSAGE(MESS_1,XXX1)
	ON_MESSAGE(MESS_2,XXX2)
	ON_MESSAGE(MESS_3,XXX3)
	ON_MESSAGE(MESS_4,XXX4)
	ON_MESSAGE(MESS_5,XXX5)
	ON_MESSAGE(MESS_6,XXX6)
	ON_MESSAGE(MESS_7,XXX7)
END_MESS_MAP	

在接受消息进程中处理相应的映射函数:

	XXX1()
	XXX2()
	XXX3()
	XXX4()
	XXX5()
	XXX6()
	XXX7()

其中,sendmessage和postmessage之间的区别:
SendMessage发送“不进队消息”,直接把消息发送给窗口,并调用该窗口的窗口过程函数进行处理。在窗口过程对消息处理完毕后,返回处理结果。
PostMessage发送“进队消息”。将消息放入与创建窗口的线程相关联的消息队列后立即返回

猜你喜欢

转载自blog.csdn.net/qq_37774304/article/details/86474315
今日推荐