Net中exe之间的消息传递
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之间的消息传递的更多相关文章
- DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间
dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...
- 【Win32 API】利用SendMessage实现winform与wpf之间的消息传递
原文:[Win32 API]利用SendMessage实现winform与wpf之间的消息传递 引言 有一次心血来潮,突然想研究一下进程间的通信,能够实现消息传递的方法有几种,其中win32ap ...
- 【技术博客】利用handler实现线程之间的消息传递
[技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...
- Spring基础——在 IOC 容器中 Bean 之间的关系
一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...
- 《同一个类中不同方法之间的调用相关问题(省略的类名或者this)》
//同一个类中不同方法之间的调用相关问题(省略的类名或者this) class A { public void B() { System.out.println("b方法运行"); ...
- 深入分析:Android中app之间的交互(二,使用ComponentName)
在前一篇相关主题的博文中我们了解了如何使用Action来启动当前应用之外的Activity处理我们的业务逻辑,在本篇笔记中我在简单介绍一下使用ComponentName来与当前应用之外的应用进行交互. ...
- 持续集成:TestNG中case之间的关系
持续集成:TestNG中case之间的关系 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...
- vue中兄弟之间组件通信
我们知道Vue中组件之间的通信有很多方式,父子之间通信比较简单,当我们使用vuex时候,兄弟组件之间的通信也很好得到解决 当我们项目较小时候,不使用vuex时候Vue中兄弟组件之间的通信是怎样进行的呢 ...
- 【微信小程序】mpvue中页面之间传值(全网唯一真正可行的方法,中指推了一下隐形眼镜)
摘要: mpvue中页面之间传值(注意:是页面之间,不是组件之间) 场景:A页面跳转B页面,在B页面选择商品,将商品名带回A页面并显示 使用api: getCurrentPages step1: A页 ...
随机推荐
- Java笔记(三)……基础语法
关键字 标识符 在程序中自定义的一些名称 由26个英文字母大小写,数字:0-9,符号:_ $组成 定义合法标识符规则: 数字不可以开头. 不可以使用关键字. Java中严格区分大小写. 注意:在起名字 ...
- ubuntu14.04安装opencv3.0
sudo apt-get update sudo apt-get upgrade 搭建C/C++编译环境: sudo apt-get install build-essential 安装关联库: su ...
- Storm系列(十一)架构分析之Supervisor-管理Worker进程的事件线程
处理流程: 方法原型: (defn sync-processes [supervisor]) 函数说明: Supervisor是一个supervisor-data对象. 从local-state中 ...
- Redis以及Redis的php扩展安装无错版
安装Redis 下载最新的 官网:http://redis.io/ 或者 http://code.google.com/p/redis/downloads/list 第一步:下载安装编译 #wge ...
- BOM 和 JavaScript 中的 trim
今天遇到一个 IE7 下 JSON.parse 失败的问题.经过排查发现:服务端某个配置文件编码是 UTF-8 + BOM,输出的字符串最开始包含了 BOM 字符,不是合法的 JSON. IE7 不支 ...
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13800 Accepted: 55 ...
- 10670 Work Reduction (贪心 + 被题意坑了- -)y
Problem C: Work Reduction Paperwork is beginning to pile up on your desk, and tensions at the workpl ...
- 如何把jquery 的dialog和ztree结合
第一步:先准备好juqury-ui.ztree 的js文件和css 文件 第二步:example.jsp文件代码中写 ..引入jqueryui.ztree 的js和css文件 <body> ...
- iOS 检测网络状态
一般有两种方式,都是第三方的框架,轮子嘛,能用就先用着,后面再优化. 一:Reachability 1.首先在AppDelegate.h添加头文件"Reachability.h", ...
- Delphi调用java开发的WebService,传入参数出错
http://www.cnblogs.com/zhangzhifeng/p/3397053.html 调用没有参数的服务正常,当调用有参数的服务出现以下错误java.util.concurrent.E ...