码迷,mamicode.com
首页 > 系统相关 > 详细

VC进程间通信之消息传递

时间:2015-07-20 19:45:20      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:


PostMessge或者SendMessage()实现进程间通讯


方法1: PostMessge或者SendMessage()消息机制

项目1中发送消息:

#define WM_MYMESSAGE WM_USER + 1 

//目标进程的窗口类名(可通过Spy++工具查看)和窗口名 
CWnd *pWnd = CWnd::FindWindow("#32770", "MfcTest");
if (NULL != pWnd)
{
	pWnd->PostMessage(WM_MYMESSAGE, NULL, NULL);
}

或者:
HWND hWnd = ::FindWindow("#32770", "MfcTest");
if (NULL != hWnd)
{
	::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);
}
项目2中接收消息:

.h中声明:

afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);

.cpp中定义:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
   ... 
   ON_MESSAGE(WM_MYMESSAGE, OnMyMessage) 
   ... 
END_MESSAGE_MAP() 

LRESULT CMfcTestDlg::OnMyMessage(WPARAM wp, LPARAM lp)
{
	AfxMessageBox("Hello World");

	return 0;
}


说明:

使用PostMessage或SendMessage均可,区别在于SendMessage阻塞,直到目标窗口程序处理完消息再返回,而PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。通常使用PostMessage,如果为了探测目标进程是否存在,则用SendMessage比较好。


方法2: 消息接收端采用PreTranslateMessage()来处理

发送端代码:

#define WM_MYMESSAGE WM_USER + 1 

//目标进程的窗口类名(可通过Spy++工具查看)和窗口名 
CWnd *pWnd = CWnd::FindWindow("#32770", "MfcTest");
if (NULL != pWnd)
{
	pWnd->PostMessage(WM_MYMESSAGE, NULL, NULL);
}

或者:
HWND hWnd = ::FindWindow("#32770", "MfcTest");
if (NULL != hWnd)
{
	::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);
}

接收端代码:

.h声明

BOOL CMfcTestDlg::PreTranslateMessage(MSG* pMsg);

.cpp定义

#define WM_MYMESSAGE WM_USER + 1 

BOOL CMfcTestDlg::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->message ==  WM_USER + 1)
	{
		AfxMessageBox("Hello World");
	}

	return CDialog::PreTranslateMessage(pMsg);
}


说明:

这里将接收端处理放在PreTranslateMessage 中, 因此发送端必须选择 PostMessage, 因为SendMessage消息不放进消息队列, PreTranslateMessage里不能收到这个消息。






版权声明:本文为博主原创文章,未经博主允许不得转载。

VC进程间通信之消息传递

标签:

原文地址:http://blog.csdn.net/jiangqin115/article/details/46969769

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!