VC中使用自定义消息在进程间通讯

VC/MFC 不同进程间的消息通信与数据(字符串)发送 使用WM_COPYDATA消息通信 对于少量数据可以用WM_COPYDATA方便地实现通信。由于SendMessage()是阻塞的,只有接收方响应了消息,SendMessage()才能返回,否则一直阻塞。所以,对于大量数据来说,用SendMessage()就容易造成窗口假死。 1  通过WM_COPYDATA消息实现进程间通信的方法 在Win32中,WM_COPYDATA消息主要目的是允许在进程间传递只读数据。SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发 阅读详情

进程间通讯应该是老的内容了,相信用VC的大侠们都知道,书本上也都有介绍。我在这只是对自己用过的东西简单的总结一下,希望对有兴趣者有帮助。

WINDOWS中进程间通讯的方式很多,如:消息机制,共享内存机制,SOCKET,COM,RPC等等,需要时可以根据具体情况来选择使用的方式。我在这本文中仅介绍进程间的自定义消息通讯机制。

1,WINDOWS中自定义消息的定义和使用;

在WNDOWS中消息分系统消息和自定义消息。系统消息定义从0到0x3FF,使用0x400到0x7FFF定义自己的消息。Windows把0x400定义为WM_USER。如果想定义自己的一个消息,可以在WM_USER上加上一个值:
#define WM_CONTROLPRINT     WM_USER+1001
另一种自定义窗口消息的方法是用RegisterWindowsMessage()函数来注册这个消息。与在WM_USER上加上某个数相比,它的好处是不必考虑所表示的消息标识符是否超出工程的允许范围。如:
const UINT WM_CONTROLPRINT=RegisterWindowMessage("reg_data");
在接收消息的程序中,需要对添加对应消息的响应处理函数,并将消息和消息处理函数关联,要不它不知道消息发给谁:
//函数定义,在//AFX_MSG中
afx_msg LRESULT OnControlPrint(WPARAM wParam,LPARAM lParam);
//函数实现
LRESULT CSendDlg::OnControlPrint(WPARAM wParam,LPARAM lParam)
{
}
//关联映射,在BEGIN_MESSAGE_MAP中
ON_MESSAGE(WM_CONTROLPRINT,OnControlPrint)//使用WM_USER+1001定义的消息
ON_REGISTERED_MESSAGE(WM_CONTROLPRINT,OnControlPrint)//使用RegisterWindowMessage定义的消息
消息如何传递呢?我们需要发送消息时,可以使用PostMessage和SendMessage。这两个消息发送函数不一样的地方就是SendMessage发送完消息后会等待消息处理函数处理完成后返回,PostMessage则不等待。所以,可以说PostMessage是不可靠的,实际运用中可以根据具体情况来确定用那一个。这两个函数的具体使用请查看MSDN。
如我向主窗体发送一个消息(第一个参数是接收消息的窗体句柄,第二个参数是要发送的消息,后边两个为随消息发送的参数信息):
::SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_CONTROLPRINT,NULL,0);

2,使用自定义消息在进程间通讯;

      我们可以用VC60建立两个基于对话框的工程,一个命名为Send,一个命名为Revice。

在Send对话框中添加一个名成为IDC_BUTTONSEND的按钮。

在SendDlg.h和ReviceDlg.g中都添加自定义消息。消息实现进程间通信,需要在这两个程序中定义或注册相同的消息,才能保证数据通信顺利进行:

#define WM_CONTROLPRINT     WM_USER+1001

在Send工程中添加IDC_BUTTONSEND按钮的单击处理事件,并添加代码:

void CSendDlg::OnButtonsend()

{

     //获取窗口句柄
    CWnd *pWnd=CWnd::FindWindow(NULL,_T("Revice"));
    if(pWnd==NULL)
   {
     AfxMessageBox("接收程序没有运行!");
     return ;
   }

   //发送消息
  pWnd->SendMessage(WM_SENDYKDISABLE,NULL,0);
}

在Revice工程中添加WM_CONTROLPRINT 的处理函数,关联映射,和上边描述的过程一样,在处理函数中添加相应的处理代码。这里就不多说了!

 

 

进程间消息通信RegisterWindowMessage(C++源码) 窗口消息机制是Windows GUI的核心,例如:WM_COPYDATA、WM_PAINT等,也可以通过WM_USER + n自定义消息。但当程序的模块越来越多时,自定义消息就有可能会重复。比如:俩个dll都定义WM_USER + 10,当窗口收到WM_USER + 10时,根本不知道是谁发的,会导致逻辑错误。就是为了解决这个问题的,用于注册系统范围内的唯一窗口消息id,输入是字符串,返回消息id,只要字符串相同,就返回相同的ID,这样就解决了自定义消息冲突问题。 阅读详情

相关推荐

RegisterWindowMessage函数使用中的问题

同一个程序的不同实例间进行通讯例子。 采用C和API编写,没有MFC的东西。 主要借助自定义消息来实现。 #define UMSG wm_user+....,此值不合适的话,不会收到消息。 RegisterWindowMessage("UMSG"); SendMessage(HWND_BROADCAST,UMSG,0,0);

进程间通信 1 -- 使用RegisterWindowMessage实现消息通信

<br />进程间通信的方法有很多,比如使用注册消息,内存映射,WM_COPYDATA等,下面先讲使用注册消息实现的方法。<br /> <br />使用注册消息比较简单,核心是消息的接收端和消息的发送端(接收端和发送端在两个不同的进程)必须注册相同的消息,这样发送消息才能识别。<br /> <br />下面看看具体实现:<br /> <br /><br />一,发送消息进程<br /> <br />1, 在发送消息程序A注册消息:<br /> <br />const UINT WM_UPDATE_ALARM

xust999的专栏 9644

易语言[叮咚]自定义消息实现进程通信C源码,易语言[叮咚]自定义消

易语言仿QQ聊天通讯源码,仿QQ聊天通讯,RegisterWindowMessage,SendMessage,lstrcpyn_整数型,GetCurrentProcessId,FindWindow,WriteProcessMemory,newlong,SetWindowLong,CallWindowProc,OpenProcess,ReadProcessMemory,lstrlen,CloseHandle,RtlMoveMemory,Rtl

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

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

学无止尽,谨言慎行! 2260

快速理解OSI七层模型(举例理解,数据传输过程,深入理解OSI七层模型)

我们需要了解互联网的本质是一系列的网络协议,这个协议就叫做OSI协议(开放系统互联(Open System Interconnection)),它是由ISO(国际标准化组织)定义的。 需要注意,随着时代的发展,OSI已经被TCP/IP 4层模型淘汰,在当今世界上并没有大规模的使用。 那么对于OSI,人们按照功能不同,分工不同,人为的将OSI的分为七层。实际上这七层是并不存在的,也就是说没有这些概念,而我们今天提到的七层概念,只是人为的划分而已。目的只是为了让大家更好地理解这些都是用来做什么的。

CN_TangZheng的博客 3万+

脑机接口(BCI)从原理到开发实战 10|脑控外设:用脑电波控制机械臂/游戏

摘要: 脑机接口(BCI)的“最后一公里”是将分类结果转化为实际动作的关键环节。本文介绍如何通过指令映射、硬件通信和执行反馈实现脑控外设,包括离散/连续控制策略、防抖处理及串口/蓝牙通信方法。通过两个实战案例(运动想象控制机械臂抓取、P300/SSVEP控制游戏)和完整项目(OpenBCI控制小车),演示了从分类标签到设备动作的完整流程,重点涵盖指令生成算法(多数投票)、Python与Arduino的串口通信集成,为BCI系统落地提供实用解决方案。(149字)

小明的博客 766

SendMessage进程间简单通信问题

本例以两个VC Dialog application 为例用SendMessage进行两进程间简单通信:主要API:FindWindow(LPCTSTR lpClassName,    LPCTSTR lpWindowName  )//通过进程名得到进程handle SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam =

qj840828的专栏 1334

Zabbix7.4监控系统在Rocky Linux10.0上的完整部署流程(含MariaDB配置)

本文详细介绍了在Rocky Linux 10.0操作系统上部署企业级监控系统Zabbix 7.4的完整流程,并重点阐述了与MariaDB数据库的深度集成与性能优化配置。内容涵盖从系统环境准备、数据库安装与安全加固、Zabbix核心组件部署,到服务配置、Web界面初始化以及生产环境高级调优的全方位实战指南,旨在帮助用户构建稳定高效的监控平台。

weixin_29200741的博客 328

VC 进程间通讯发送自符串消息

VC 进程间通讯发送自符串消息 VC 进程间通讯发送自符串消息发送方:HWND   hWnd   =   ::FindWindow(NULL,_T("无标题 - OfficeMFC"));//查找要发给谁 if(hWnd!=NULL) {   COPYDATASTRUCT   cpd;   /*给COPYDATASTRUCT结构赋值*/    cpd.dwData   =   0;

Joetao的专栏 1293

使用mmdetection快速复现计算机视觉顶会论文

使用mmdetection中支持的算法运行自定义数据集

m0_56896669的博客 2422

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 988

自定义消息在进程间通讯

进程间通讯应该是老的内容了,相信用VC的大侠们都知道,书本上也都有介绍。我在这只是对自己用过的东西简单的总结一下,希望对有兴趣者有帮助。 WINDOWS中进程间通讯的方式很多,如:消息机制,共享内存机制,SOCKET,COM,RPC等等,需要时可以根据具体情况来选择使用的方式。我在这本文中仅介绍进程间的自定义消息通讯机制。 1,WINDOWS中自定义消息的定义和使用; 在WNDOWS中消息分

WUYUAN2011WOAINI的专栏 884

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8401

使用VC如何处理自定义消息

  使用VC如何处理自定义消息ClassWizard不允许增加用户自定义消息,所以你必须手工输入。输入后,ClassWizard就可以象处理其它消息一样处理你自定义的消息了。 下面是增加自定义消息的步骤: 第一步:定义消息。开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。 第二步:

hjyhh的专栏 2648

分布式优化 (Distributed Optimization) 算法详解及案例分析

分布式优化是一种将优化问题分解为多个子问题并在多个计算节点上并行求解的方法。其目标是通过分布式计算资源高效地求解大规模优化问题。

闲人编程的博客 2709

YOLO26改进策略【YOLO和Mamba】| MLLA:Mamba-Like Linear Attention,融合Mamba设计优势的注意力机制

本文记录的是利用模块优化的目标检测网络模型。模块具有独特优势。它不同于传统模块,能同时兼顾局部特征高效建模与长距离交互学习。常见模块要么在局部特征处理上有优势但长距离交互能力弱,要么反之,而模块克服了此问题。它融合了Mamba模型和线性注意力机制的优势,通过独特的结构设计,能够在保持计算效率的同时,精准地建模局部特征并学习长距离交互信息。本文将其用于的模型改进和二次创新,能够更加关注图像中的重要特征区域,抑制背景等无关信息的干扰,从而突出目标物体的关键特征。Demystify Mamba in Vision

Limiiiing的博客 213

VC进程间通信之消息传递PostMessge()或SendMessage()

SendMessage, PostMessage实现进程通讯 项目1中发送消息: #define WM_MYMESSAGE WM_USER + 1 CWnd *pWnd = CWnd::FindWindow("#32770", "MfcTest"); //目标进程的窗口类名和窗口名 if (pWnd) { pWnd->SendMessage(WM_MYMESSAGE, N

jiangqin115的专栏 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vc 进程间通讯

在Windows下各个任务是以不同的进程来完成的,当一个进程启动后,操作系统为其分配了4GB的私有地址空间,由于位于同一个进程中的线程共享同一个地址空间,所以线程间的通信很简单,就像两个人如果在同一个房间里说话的话就比较容易,只要动动嘴皮子就OK了, 但是如果在两个国家里就比较麻烦,必须借助于一些其他的手段,比如打电话等. 以下介绍四种进程通信方式,虽然是在windows下的环境但是在其他的操作系

ITBUG的专栏 2976

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC6.0下利用消息实现内部进程通讯

内部进程间通讯和数据交换有消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。本文就通过编制一个主控软件和一个受其操作的底层工作软件

ark1111的专栏 1135
上一篇: 使用VC自绘美化通用控件
下一篇: 使用内存共享机制进程间通讯
lujunql
博客等级 码龄19年 156粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

lujunql

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

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

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

打赏作者

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

抵扣说明:

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

余额充值