自定义消息
系统定义消息,非用户定义,其范围在
[0x0000,0x03ff]
之间,也就是说我们定义的消息的范围不能在这之间,如果用户自定义的消息,可以使用如下两种方式(其实不止两种):
- WM_USER:0x0400 - 0x7FFF
- RegisterWindowMessage:0xC000 - 0xFFFF
这里我们就用这两种方式来实现进程之间的通信
案例效果演示:
服务端窗口及功能实现步骤:
-
搭建服务端界面:
-
为两个编辑框添加变量:
-
在Dlg源文件中自定义消息(两种不同方式):
#define WM_COMM (WM_USER + 100) // WM_COMM 是我们定义的消息,WM_USER的值是0x4000const UINT wm_nRegMsg = RegisterWindowMessage(_T("reg_data")); // 调用函数让操作系统为我们定义一个消息
- 为两个发送按钮实现方法:
可以为按钮自定义ID
- 第一个发送按钮(WM_COMM消息):
双击按钮即可写代码
updateData(); // 使最新的数据同步更新到变量中CWnd* pWnd = CWnd::FindWindow(NULL, _T("DataRecv")); // 查找客户端窗口
if(pWnd == NULL)
{AfxMessageBox(TEXT("Unableto find DataRecv.")); //没有找到窗口return;
}UINT uMsg;
uMsg = _ttoi(m_usermsg); // 字符符 --> 整形(自定义消息只能传送整形数据)pWnd->SendMessage(WM_COMM, NULL, (LPARAM)uMsg); // 以客户端的名义发送消息
- 第二个发送按钮(wm_nRegMsg消息):
这个按钮的内容和上面的内容基本一样
UpdateData(); CWnd* pWnd = CWnd::FindWindow(NULL, _T("DataRecv"));
if(pWnd == NULL)
{AfxMessageBox(TEXT("Unableto find DataRecv.")); return;
}UINT uMsg;
uMsg = _ttoi(m_regmsg); pWnd->SendMessage(wm_nRegMsg, NULL, (LPARAM)uMsg);
服务端已经写好,接下来实现客户端编写
客户端窗口及功能实现步骤:
- 窗口搭建:
-
为两个编辑框添加变量:
-
在Dlg源文件中自定义消息(两种不同方式):
#define WM_COMM (WM_USER + 100)const UINT wm_nRegMsg = RegisterWindowMessage(_T("reg_data"));
-
消息映射
-
声明两个自定义方法(Dlg头文件中):
-
实现OnUserReceiveMsg方法
LRESULT CDataRecvDlg::OnUserReceiveMsg(WPARAM wParam, LPARAM lParam)
{m_usermsg.Format(_T("%d"), int(lParam)); // 获取数据UpdateData(FALSE); // 更新数据到控件中return 0;
}
- 实现OnRegReceiveMsg方法
LRESULT CDataRecvDlg::OnRegReceiveMsg(WPARAM wParam, LPARAM lParam)
{m_regmsg.Format(_T("%d"), int(lParam));UpdateData(FALSE);return 0;
}
下一篇:(二)Win32进程通信 —— 内存映射文件
作者:浪子花梦
Time:2020.02.14
情人节快乐,各位