1、Windows系统中,系统消息的范围是0到WM_USER - 1 ,WM_USER是一个常量,其值为0x400,
WM_USER以上的值用于自定义消息;
2、可以简单地用WM_USER加上一个数值定义一个消息ID{说明:消息其实就是一个常量值}
3、使用API函数RegisterWindowMessage可以注册一个系统内唯一的消息ID;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
1、建立基于对话框的MFC应用程序UserMsg
//主对话框源文件最开始出添加全局定义
//直接定义的自定义消息
#define WM_MY_DEFINED_MSG (WM_USER + 101)
//注册新消息所用的字符串
#define MY_REGISTERED_MSG_STR _T("MY_MSG_STRING")
//存储新消息的ID的变量
UINT WM_MY_REGISTERED_MSG ;
///主对话框的构造函数添加
WM_MY_REGISTERED_MSG = RegisterWindowMessage(MY_REGISTERED_MSG_STR);
主对话框上添加一个静态文本控件,其ID为IDC_OUTPUT
将“确定”按钮文本改为“测试新这侧的消息”,响应代码:
void CUserMsgDlg::OnOK()
{
// TODO: Add extra validation here
//投递新注册的消息
PostMessage(WM_MY_REGISTERED_MSG ,0 , 0);
}
添加按钮ID为IDC_BTN_MYMSG,其文本为“测试自定义消息”
void CUserMsgDlg::OnBtnMymsg()
{
// TODO: Add your control notification handler code here
//投递直接定义的自定义消息
PostMessage(WM_MY_DEFINED_MSG, 0 ,0);
}
主对话框头文件中添加如下声明:
afx_msg void OnMyRegisteredMsg();
afx_msg void OnMyDefinedMsg();
//}}AFX_MSG
源文件中添加:
void CUserMsgDlg::OnMyRegisteredMsg()
{
///WM_MY_REGISTERED_MSG消息响应函数
TCHAR szBuf[128] = {0};
_stprintf(szBuf, _T("收到了用RegisterWindowMessage注册的消息:WM_MY_REGISTER_MSG ,ID = 0x% X") ,WM_MY_REGISTERED_MSG);
SetDlgItemText(IDC_OUTPUT ,szBuf);
}
void CUserMsgDlg::OnMyDefinedMsg()
{
///WM_MY-defined_msg消息响应函数
TCHAR szBuf[128] = {0};
_stprintf(szBuf, _T("收到了自定义消息:WM_MY_DEFINED_MSG ,ID = 0x% X") ,WM_MY_DEFINED_MSG);
SetDlgItemText(IDC_OUTPUT ,szBuf);
}
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MY_DEFINED_MSG , OnMyDefinedMsg)
ON_REGISTERED_MESSAGE(WM_MY_REGISTERED_MSG , OnMyRegisteredMsg)

说明:
1、RegisterWindowMessage函数定义的消息可以保证系统内唯一,不同的进程调用该函数,用相同的字符串可以得到相同的ID;
2、自定义消息WM_MY_DEFINED_MSG消息的响应是ON_MESSAGE ,而WM_MY_REGISTERED_MSG响应要用
ON_REGISTERED_MESSAGE宏,否则无法正确响应消息。