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

c#进程间通信(Inter-Process Communication)

原文: c#进程间通信(Inter-Process Communication)

c#进程间通信(IPC, Inter-Process Communication)

接收端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //for  MarshalAs


namespace receive
{
    public partial class Receive : Form
    {
public Receive()
        {
            InitializeComponent();
        }
        protected override void DefWndProc(ref System.Windows.Forms.Message m)          //重构此函数接收数据
        {
            switch (m.Msg)
            {
                case Message.WM_TEST:  //确定类型后,处理数据
                     string  message = string.Format("收到消息!参数为:{0},{1},{2}", m.Msg, m.WParam, m.LParam);
                    label1.Text = message;
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;
            }
        }
    }
    class Message
    {
        public const int USER = 0X0400;
        public const int WM_TEST = USER + 101;
        public const int WM_MSG = USER + 102;
    }

}

发送端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //for DllImport

namespace send
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(int hWnd, int msg, int wParam, int lParam);      //发送消息
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);      //获取另一个进程的窗口句柄

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int hWnd = FindWindow(null, @"Receive"); 
            SendMessage(hWnd, Message.WM_TEST, 99, 100);//参数1、窗口句柄。2 、消息类型。 3、数据1。 4、数据2
        }
    }
    class Message
    {
        public const int USER = 0X0400;
        public const int WM_TEST = USER + 101;      //简单的数据传输类型,传两个整数。
        public const int WM_MSG = USER + 102;
    }
}

比较复杂的字符串传输:

发送端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //for DllImport

namespace send
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
       // private static extern int SendMessage(int hWnd, int msg, int wParam, int lParam);       //发送消息
        private static extern int SendMessage(int hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam);   
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);      //获取另一个进程的窗口句柄

        const int WM_COPYDATA = 0x004A;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int hWnd = FindWindow(null, @"Receive");
            string message = "你好消息成功发送!";
            int i = message.Length;
            byte[] sarr = System.Text.Encoding.Default.GetBytes(message);
            COPYDATASTRUCT cds;
            cds.dwData = (IntPtr)100;
            cds.lpData = message;
            cds.cbData = sarr.Length+1;         //此值错误会引发接收端崩溃
            SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
        }
    }
    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }
}
View Code

接收端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //for  MarshalAs


namespace receive
{
    public partial class Receive : Form
    {
        const int WM_COPYDATA = 0x004A;
        const int WM_MYSYMPLE = 0x005A;

        public Receive()
        {
            InitializeComponent();
        }
        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:
                    COPYDATASTRUCT myStr = new COPYDATASTRUCT();
                    Type myType = myStr.GetType();
                    myStr = (COPYDATASTRUCT)m.GetLParam(myType);    //m中获取LParam参数以myType类型的方式,让后转换问结构体。
                    label1.Text = myStr.lpData;
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;
            }
        }

    }
    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }
}
View Code

下载:链接:http://pan.baidu.com/s/1c0lWpt2 密码:yvzz

其他方法参考:

http://blog.csdn.net/feiren127/article/details/5459827

附:在程序中使用代码启动程序

using System.Diagnostics;   // for ProcessStartInfo

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"C:\Users\dell\Documents\Visual Studio 2010\Projects\receive\receive\bin\Debug\receive.exe";
Process pro = new Process();
pro.StartInfo = startInfo;
pro.Start();        //开启
IntPtr hWnd = pro.MainWindowHandle;    //进程的句柄
pro.Kill();            //关闭

 参考: http://blog.csdn.net/u011000290/article/details/48108557

相关文章:

  • vim简单的文本编辑命令
  • 【BZOJ】2879: [Noi2012]美食节
  • gulp 教程
  • 虚拟化之vmx配置文件
  • 致北京
  • 二进制方式快速安装MySQL数据库
  • 沙盒 文件操作
  • PHP上传(单个)文件示例
  • UESTC 1246 拆x3
  • 积分显示算法(4.34.5 4.14 4.65)
  • linux中ssh免密码登录
  • postgresql cluster和correlation
  • 有限概率(拉普拉斯概率)
  • Android Stduio统计项目的代码行数
  • struts2获取web元素(request、session、application)
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 《剑指offer》分解让复杂问题更简单
  • 2017-08-04 前端日报
  • 5、React组件事件详解
  • axios 和 cookie 的那些事
  • C# 免费离线人脸识别 2.0 Demo
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript设计模式之工厂模式
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Selenium实战教程系列(二)---元素定位
  • TCP拥塞控制
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 产品三维模型在线预览
  • 浅谈Golang中select的用法
  • 算法之不定期更新(一)(2018-04-12)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 以太坊客户端Geth命令参数详解
  • 做一名精致的JavaScripter 01:JavaScript简介
  • kubernetes资源对象--ingress
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $(selector).each()和$.each()的区别
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (排序详解之 堆排序)
  • (三)Honghu Cloud云架构一定时调度平台
  • (三)uboot源码分析
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET和.COM和.CN域名区别
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net图片验证码生成、点击刷新及验证输入是否正确