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里不能收到这个消息。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-08 17:10:00