Window下使用RegisterWindowMessage来实现消息通讯

本文介绍了如何使用RegisterWindowMessage函数来定义唯一窗口消息,实现不同应用程序间的通信。文章详细讲解了消息注册、发送及接收的过程,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RegisterWindowMessage函数介绍

功能:

  定义一个新的窗口消息,该消息保证在整个系统中是唯一的。发送或发布消息时可以使用消息值。
定义

UINT RegisterWindowMessageA(
  [in] LPCSTR lpString
);

参数

[in] lpString
类型:LPCSTR
要注册的消息。

返回值

类型:UINT
如果消息注册成功,则返回值是0xC0000xFFFF 范围内的消息标识符。
如果函数失败,则返回值为零。

备注

  “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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunkingYang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值