1、创建一个消息通讯类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace TesMessage
{
//WM_COPYDATA消息所要求的数据结构
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;

[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
public class MessageCls
{
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_COPYDATA
int 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 e)
{
if (e.Msg == WM_COPYDATA)
{
CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct));
return cds.lpData.ToString(); //将文本信息显示到文本框
//MessageBox.Show(cds.lpData);
}
return null;
}
}
}

2、调用

public Form1()
{
InitializeComponent();
}
//发送
private void button1_Click(object sender, EventArgs e)
{
MessageCls.SendMessage("TesMessage", 1,this.textBox1.Text.Trim());
}
//接收消息方法
protected override void WndProc(ref System.Windows.Forms.Message e)
{
string msg=MessageCls.ReceiveMessage(ref e);
if(msg!=null)
this.label3.Text = msg;
base.WndProc(ref e);

}

注意,有时候直接运行代码调试状态,可能会发送通讯失败。解决办法:直接运行bin文件下的exe文件。。

提供下载地址:http://download.csdn.net/detail/ffuqiaoq/8527945

Net中exe之间的消息传递的更多相关文章

  1. DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间

    dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...

  2. 【Win32 API】利用SendMessage实现winform与wpf之间的消息传递

    原文:[Win32 API]利用SendMessage实现winform与wpf之间的消息传递 引言    有一次心血来潮,突然想研究一下进程间的通信,能够实现消息传递的方法有几种,其中win32ap ...

  3. 【技术博客】利用handler实现线程之间的消息传递

    [技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...

  4. Spring基础——在 IOC 容器中 Bean 之间的关系

    一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...

  5. 《同一个类中不同方法之间的调用相关问题(省略的类名或者this)》

    //同一个类中不同方法之间的调用相关问题(省略的类名或者this) class A { public void B() { System.out.println("b方法运行"); ...

  6. 深入分析:Android中app之间的交互(二,使用ComponentName)

    在前一篇相关主题的博文中我们了解了如何使用Action来启动当前应用之外的Activity处理我们的业务逻辑,在本篇笔记中我在简单介绍一下使用ComponentName来与当前应用之外的应用进行交互. ...

  7. 持续集成:TestNG中case之间的关系

    持续集成:TestNG中case之间的关系   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...

  8. vue中兄弟之间组件通信

    我们知道Vue中组件之间的通信有很多方式,父子之间通信比较简单,当我们使用vuex时候,兄弟组件之间的通信也很好得到解决 当我们项目较小时候,不使用vuex时候Vue中兄弟组件之间的通信是怎样进行的呢 ...

  9. 【微信小程序】mpvue中页面之间传值(全网唯一真正可行的方法,中指推了一下隐形眼镜)

    摘要: mpvue中页面之间传值(注意:是页面之间,不是组件之间) 场景:A页面跳转B页面,在B页面选择商品,将商品名带回A页面并显示 使用api: getCurrentPages step1: A页 ...

随机推荐

  1. WebView相关设置

    //定义一个WebView的WebSetting        WebSettings mWebSettings = mWebView.getSettings(); // 让网页自适应屏幕宽度     ...

  2. 从源码剖析一个Spark WordCount Job执行的全过程

      原文地址:http://mzorro.me/post/55c85d06e40daa9d022f3cbd   WordCount可以说是分布式数据处理框架的”Hello World”,我们可以以它为 ...

  3. HDU5627--Clarke and MST (bfs+位运算)

    http://www.cnblogs.com/wenruo/p/5188495.html Clarke and MST Time Limit: 2000/1000 MS (Java/Others) M ...

  4. 图的强连通&双连通

    http://www.cnblogs.com/wenruo/p/4989425.html 强连通 强连通是指一个有向图中任意两点v1.v2间存在v1到v2的路径及v2到v1的路径. dfs遍历一个图, ...

  5. 读FCL源码系列之List<T>---让你知其所以然---内含疑问求大神指点

    序言 在.NET开发中,List<T>是我们经常用到的类型.前段时间看到其他部门小伙伴讨论“两个List(10W个元素)集合求并集,list1.Where(p=>list2.Cont ...

  6. smarty对网页性能的影响

    百度有个VUI模块,它负责将所有的广告信息縇染成HTML返回给调用方,它采用的是HHVM,縇染模板用的是smarty,前端服务器用的是nginx. 此前知道,新浪微博以前也用的是smarty,自从鸟哥 ...

  7. IOS tableView 自定义cell 多行时 文字重复现象

    今天写了一个demo,有一个问题,有很多cell,但是超过一页后往下翻,发现文字有重叠现象, cell用的是重用机制,按说不会这样,最终解决的方案: 勾选这个,clears graphics cont ...

  8. linux 打补丁

    http://blog.csdn.net/maotianwang/article/details/11107083

  9. [转]Form中控制Tab画布不同标签间切换的方法

    转自:http://yedward.net/?id=68 Form中一般常用的画布类型包括content.stacked.tab这三种,其实content类型的画布是每一个form都必须有的,而且只能 ...

  10. log4j中存在日志无法打印问题解决

    我在项目中配置双数据中心,原来类包名称前最都是一致的,后来由于项目的需要根据数据来源命名不同的类包名称,这个导致一个问题,sql语句运行无法正常打印出来,提示以下内容: log4j:WARN No a ...