关于C#中实现两个应用程序消息通讯的问题

最近项目中需要在两个应用程序之间通讯,这里的两个程序是在一台机器上,看了csdn上的一篇文章《如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据》,原理是讲清楚了,但使起来很不爽,决定自己封装一下,满足项目需要就行。

注意这里发送消息的函数:

public static void SendMessage(string destProcessName, int msgID, string strMsg);

只能发送一个msgID和一个strMsg, 接收方只接收了strMsg,我的项目中已经够用了,你如果需要读msgID,还需要改一下。客户端代码请参考csdn上的原文自己写吧。

进程之间通讯的几种方法: 

在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有  

 (1)使用内存映射文件  
 (2)通过共享内存DLL共享内存  
 (3)使用SendMessage向另一进程发送WM_COPYDATA消息  
 
比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一种方法.  
WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。
 SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:  
 
这个函数的原型及其要用到的结构如下:

SendMessage(hwnd, WM_COPYDATA, wParam, lParam);

其中:
 WM_COPYDATA对应的十六进制数为0x004A  
 wParam设置为包含数据的窗口的句柄。
 lParam指向一个COPYDATASTRUCT的结构:

typedef  struct  tagCOPYDATASTRUCT 
{   DWORD  dwData;  //用户定义数据   DWORD  cbData;  //数据大小   PVOID  lpData;  //指向数据的指针   
} COPYDATASTRUCT;

该结构用来定义用户数据。  


具体过程如下: 

首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息。
接受方在DefWndProc事件中处理这条消息。由于中文编码是两个字节, 所以传递中文时候字节长度要搞清楚。

接收方

 

protected override void DefWndProc(ref  System.Windows.Forms.Message m)
{switch (m.Msg){case WinMessageUtil.WM_COPYDATA:string str = WinMessageUtil.ReceiveMessage(ref m);break;default:break;}base.DefWndProc(ref  m);
}

操作为

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;namespace Speeding.Util
{//WM_COPYDATA消息所要求的数据结构public struct CopyDataStruct{public IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}/// <summary>/// 本类封装了一些进程间通讯的细节/// </summary>public class WinMessageUtil{public const int WM_COPYDATA = 0x004A;//通过窗口的标题来查找窗口的句柄[DllImport("User32.dll", EntryPoint = "FindWindow")]private static extern int FindWindow(string lpClassName, string lpWindowName);//在DLL库中的发送消息函数[DllImport("User32.dll", EntryPoint = "SendMessage")]private static extern int SendMessage(int hWnd,                        // 目标窗口的句柄  int Msg,                        // 在这里是WM_COPYDATAint wParam,                    // 第一个消息参数ref  CopyDataStruct lParam        // 第二个消息参数
            );/// <summary>/// 发送消息,只能传递一个自定义的消息ID和消息字符串,想传一个结构,但没成功/// </summary>/// <param name="destProcessName">目标进程名称,如果有多个,则给每个都发送</param>/// <param name="msgID">自定义数据,可以通过这个来决定如何解析下面的strMsg</param>/// <param name="strMsg">传递的消息,是一个字符串</param>public static void SendMessage(string destProcessName, int msgID, string strMsg){if (strMsg == null)return;//按进程名称查找,同名称的进程可能有许多,所以返回的是一个数组Process[] foundProcess = Process.GetProcessesByName(destProcessName);foreach (Process p in foundProcess){int toWindowHandler = p.MainWindowHandle.ToInt32();if (toWindowHandler != 0){CopyDataStruct cds;cds.dwData = (IntPtr) msgID;   //这里可以传入一些自定义的数据,但只能是4字节整数      cds.lpData = strMsg;            //消息字符串cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;  //注意,这里的长度是按字节来算的//发送方的窗口的句柄, 由于本系统中的接收方不关心是该消息是从哪个窗口发出的,所以就直接填0了int fromWindowHandler = 0;SendMessage(toWindowHandler, WM_COPYDATA, fromWindowHandler, ref  cds);}}}/// <summary>/// 接收消息,得到消息字符串/// </summary>/// <param name="m">System.Windows.Forms.Message m</param>/// <returns>接收到的消息字符串</returns>public static string ReceiveMessage(ref  System.Windows.Forms.Message m){CopyDataStruct cds = (CopyDataStruct) m.GetLParam(typeof(CopyDataStruct));return cds.lpData;}}
}

 

转载于:https://www.cnblogs.com/DoNetCShap/archive/2012/06/26/2564460.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#提升性能的几点提示和技巧

C&#xff03;性能提示和技巧在Raygun[1]&#xff0c;我们是一群非常懂多种语言的开发人员。Raygun的各个部分使用不同的语言和框架编写-最好的工作方式。鉴于大量的C&#xff03;和我们正在处理的数据的爆炸性增长&#xff0c;在不同的时间需要进行一些优化工作。大部分重大的…

电脑睡眠快捷键_电脑快速进入睡眠的快捷键是什么?

电脑快速进入睡眠的快捷键是什么&#xff1f;正常情况下需要点击电源再按睡眠&#xff0c;小编觉得有点麻烦&#xff0c;如果你想要进入睡眠状态能够像锁屏快捷键那样就好了&#xff0c;那么今天就教大家如何设置睡眠快捷键&#xff0c;让你的电脑快速进入睡眠状态。我们知道电…

世界上最奇特的国界线,万万没想到...

全世界只有3.14 % 的人关注了爆炸吧知识你曾经可能多次在飞机上切换不同的国家&#xff0c;但未曾真的看见过这些国家之间的分界线。没见过之前&#xff0c;你脑海中的国界线是怎样的&#xff1f;一道高墙&#xff1f;还是一条无法逾越的鸿沟......看似正经而严谨&#xff0c;但…

Dell poweredge r210进BIOS修改磁盘控制器(SATA Controller)接口模式

Dell poweredge r210进BIOS修改磁盘控制器&#xff08;SATA Controller&#xff09;接口模式 开机后按F2键进入BIOS设置&#xff0c;如下图&#xff1a; BIOS设置主界面&#xff1a; 使用上下键移动光标到“SATA Controller”上&#xff0c;按回车键进入接口模式设置。 使用…

linux iptables导致httpd网页打不开

问题&#xff1a;httpd 服务已启动&#xff0c;80端口已开&#xff0c;但是网页就是打不开&#xff0c;重启服务器还是不行 忽然想看看log&#xff0c;记录如下&#xff1a; [Fri Jul 15 00:41:03 2011] [notice] SELinux policy enabled; httpd running as context root:syste…

二叉排序树与文件操作的设计与实现_堆排序就这么简单

一、堆排序介绍来源百度百科&#xff1a;堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆&#xff0c;是完全二叉树。前面我已经…

extjs 前端js代码调用后台函数方法

前端javascript代码部分&#xff1a; Ext.Ajax.request( { url: /Process/SuspendWorkFlow, //配置的后台函数路由 params: { wfInsId: wf.WFInstanceID, status: cmd }, //对应函数的参数 success: function () { LaunchedWFGrid.store.reload(); Ext.Msg.show({ title: &qu…

linux卸载android studio,mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案

如果你是mac ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在.废话不多说,复制粘贴就是干!!!!~~~~~~~~第一步: 复制粘贴就是干!!!!~~~~~~~~ 复制到命令行里面,直接回车就OKrm -Rf /Applications/Android\ Studi…

Tp框架如何使用事务和锁,还有查询缓存

1.事务 在ThinkPHP框架中&#xff0c;可以使用think\db\Transaction类来实现事务。 use think\Db; use think\db\Transaction;// 开始事务 Db::startTrans();try {// 执行数据库操作Db::table(user)->where(id, 1)->update([name > John]);// 提交事务Db::commit(); }…

因为没钱买衣服,我女朋友不要我了......

1 我妈为了省钱啥事都做得出▼2 高端的黄牛总是用最朴素的方法▼3 不加点什么你们觉得我阴阳怪气祖安大师怎么办&#xff1f;▼4 一天共有86400秒一天写2000首诗&#xff0c;也就是平均43.2秒一首曹植七步成诗也不过如此了▼5 如果在猫顺毛时弄乱它的毛会怎么样&#xff1…

Tech UP——EGO北京分会成立啦

古人崇敬自然&#xff0c;认为天地生万物而四时有序&#xff0c;是以春耕、夏耘、秋收、冬藏。在过去的8年里&#xff0c;InfoQ中国秉持着“促进软件开发领域知识与创新的传播”的理念&#xff0c;始终与技术人和公司在一起。经过8年的耕耘和沉淀&#xff0c;正是给大家呈现一些…

python基金会主席入门教程_Python基金会-文件IO操作,python,基础

函数功能open打开文件read读取文件write写文件close关闭文件readline行读取readlines多行读取open方法open方法&#xff1a;打开一个文件&#xff0c;返回一个文件对象(流对象)和文件描述符&#xff0c;打开文件失败则抛异常三步曲&#xff1a;创建文件&#xff0c;打开文件&am…

Sys.WebForms.PageRequestManagerTimeoutException:服务器请求超时

Sys.WebForms.PageRequestManagerTimeoutException:服务器请求超时 在页面上使用Ajax技术时&#xff0c;当页面的程序持续时间较长时&#xff0c;程序突然会中断&#xff0c;出现上述错误&#xff0c;最后查阅资料发现ScriptManager的AsyncPostBackTimeout异步请求是有时间限制…

实现一个登录:Mac+.NET 5+Identity+JWT+VS Code

.NET圈儿的朋友们&#xff0c;大家好&#xff01;我可太喜欢如今开源的.Net了&#xff0c;写代码很巴适&#xff01;所以今天分享一下之前学习的一个登录小案例&#xff0c;代码有不足之处欢迎指正&#xff01;&#xff01;&#xff01;工具&#xff1a;采用VS Code及其插件开发…

linux e514写入错误,Linux上使用vim编辑文件保存时报错:E514: write error (file system full?)...

今天在Linux上使用vim编辑文件保存时报如下错误E514: write error (file system full?)从错误看&#xff0c;是磁盘满了&#xff0c;于是使用df -hl查看磁盘使用情况$ sudo df -hlFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_myserver-lv_root 50G 43G 4.6G 91…

天体运行动图,如此美妙,如此震撼!

全世界只有3.14 % 的人关注了爆炸吧知识三体中心天体也在运动双星系统银河系与仙女系相撞模拟转自&#xff1a;奇趣物理--完--

链接链接新手变化需要注意哪些问题

昨天“新手高速早期排名提升的关键因素 ”seo文章中提到不包含在预。没有排名&#xff0c;没有交通情况只有通过链接重量提升&#xff0c;不过&#xff0c;昨天的帖子时&#xff0c;有一个提为好友。除非你是一个人或资源非常丰富的静脉。情链接也不是非常好换&#xff1f;相信…

[转载]工作面试时最难的25个问题

原文地址&#xff1a;工作面试时最难的25个问题作者&#xff1a;zcan准备是成功的一半 如果你是一个对目前的职位不满意&#xff0c;正着手去在新的一年里找到一个新的职位&#xff0c;这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须…

ASA 第五天实验

Failover的需求 • 相同的型号和硬件配置&#xff08;接口数量和模块&#xff09; • 相同的软件版本* • 相同的加密特性&#xff08;DES or 3DES&#xff09; • 相同大小的flash和RAM* 一、配置StatefulAS Lan-based FO 步骤一、 hostname ASA interface Ethernet0/0 nameif…

密封槽设计标准_哈尔滨轴承 | 超全面机械密封选型

有转动的地方&#xff0c;就有HRB轴承(400-086-6629)100多年来&#xff0c;人们采用填料一类的多种密封材料&#xff0c;使液体从液泵壳体沿着主轴的向外泄漏量不断减少。尽管现代工艺流程中采用的液泵&#xff0c;仍然广泛地沿用最古老的密封设计——填料盒&#xff0c;因为其…