在涉及到将一个进程的信息发送到另一个进程的消息,并让另一个进行消息处理,通常需要涉及到进程间通讯。
- 分别在两个进程间定义消息;
- 在要接受的进程间定义消息映射;
- 在发送消息的进程进行消息触发;
在进行发送消息的进程首先获取到接受进程的句柄,通过定义的消息进行发送消息,在接受进程定义对应的消息映射;
在发送进程定义消息:
#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发送“进队消息”。将消息放入与创建窗口的线程相关联的消息队列后立即返回