RegisterWindowMessage函数介绍
功能:
定义一个新的窗口消息,该消息保证在整个系统中是唯一的。发送或发布消息时可以使用消息值。
定义
UINT RegisterWindowMessageA(
[in] LPCSTR lpString
);
参数
[in] lpString
类型:LPCSTR
要注册的消息。
返回值
类型:UINT
如果消息注册成功,则返回值是0xC000到 0xFFFF 范围内的消息标识符。
如果函数失败,则返回值为零。
备注
“RegisterWindowMessage”函数通常用于注册消息,以便在两个协作的应用程序之间进行通信。
如果两个不同的应用程序注册相同的消息字符串,则应用程序将返回相同的消息值。消息将保持已注册状态,直到会话结束。
仅当多个应用程序必须处理同一消息时,才使用注册窗口消息。若要在窗口类中发送私有消息,应用程序可以使用WM_USER到0x7FFF范围内的任何整数。(此范围内的消息专用于窗口类,而不是应用程序。例如,预定义的控件类(如 BUTTON, EDIT, LISTBOX, 和COMBOBOX)可能使用此范围内的值。
例子
一、发送消息进程
首先,在消息发送端,注册消息
const UINT WM_MY_MESSAGE = ::RegisterWindowMessage(_T("MyMessage"));
其次,在程序需要发送消息时调用
::PostMessage(HWND_BROADCAST, WM_MY_MESSAGE, 0, 0);
参数HWND_BROADCAST表示将该消息发送到所有top-level的窗口,including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.
如果不想发给所有顶层窗口,只想发给指定窗口,就不使用HWND_BROADCAST参数,获得要发送窗口的句柄即可:
CWnd *pWnd = CWnd::FindWindow(NULL,_T("Test Process")); // 查找需要发送进程句柄
if(pWnd != NULL)
{
pWnd->PostMessage(WM_MY_MESSAGE, 0, 0);
}
二,接收消息进程
首先,同样在消息接收端,注册消息
const UINT WM_MY_MESSAGE = ::RegisterWindowMessage(_T("MyMessage"));
其次,定义消息映射:
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
然后, 在头文件声明:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
最后,在cpp文件定义函数:
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// 消息处理
return 1;
}
注意:要在消息的发送进程和接收进程注册同样的消息ID。
在接收端,如果不想用消息宏定义,也可以使用重载PreTranslateMessage,截取消息的方式:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_MY_MESSAGE)
{
// 消息处理
}
return CDialog::PreTranslateMessage(pMsg);
}