当前位置: 首页 > news >正文

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

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);
}

相关文章:

  • Java 数组、排序和查找(1)
  • 你还没用过Mybatis-Plus?丝般顺滑,快速上手!
  • css3d动画:平移、旋转、缩放
  • 【英语:基础进阶_正式场景表达】F1.五步法搞定英文面试
  • SplitFS(SOSP‘19)
  • 【数据结构与算法】第十一篇:优先级队列
  • 【LeetCode】替换空格消失的数字分割链表除自身以外数组的乘积
  • 模糊控制之Sigmoidmf隶属度函数( PLC SCL代码)
  • atoi函数的初步实现到完美优化
  • 【云原生丨Kubernetes系列16】深入学习 ConfigMap 的使用
  • Python-字典,从基础到进阶用法大总结,进来查漏补缺
  • 2. 深度生成模型-扩散模型(去噪扩散概率模型)
  • java6:枚举类和注解
  • webpack5(高级)
  • Python从入门到数据分析第一篇—Python简介- Python介绍与初探
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • interface和setter,getter
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Promise面试题2实现异步串行执行
  • Python语法速览与机器学习开发环境搭建
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 安卓应用性能调试和优化经验分享
  • 闭包--闭包作用之保存(一)
  • 程序员该如何有效的找工作?
  • 区块链共识机制优缺点对比都是什么
  • 入口文件开始,分析Vue源码实现
  • 山寨一个 Promise
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 算法-插入排序
  • 微信小程序:实现悬浮返回和分享按钮
  • 我看到的前端
  • 小程序button引导用户授权
  • elasticsearch-head插件安装
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)STM32单片机上位机
  • (5)STL算法之复制
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Google的Objective-C编码规范
  • *上位机的定义
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .gitignore文件—git忽略文件
  • .NET BackgroundWorker
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET gRPC 和RESTful简单对比
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)