c#进程间的通信方式很多种,只会这种,感觉比较简单。不懂原理,能用就行。

  假设有两个程序:server(主进程),client(子进程)

  1.server端:

     /*定义一个结构体,用来接收从子进程传过来的信息,与子进程定义的一样*/
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
} /*定义一个消息类型,与子进程定义的一样*/
const int WM_COPYDATA = 0x004A; /*处理消息的方法*/
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);
this.label2.Text = mystr.lpData;
MessageBox.Show( mystr.lpData);
break;
default:
base.DefWndProc(ref m);
break;
}
}

  2.client端:

 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; //引入这些命名空间
using System.Diagnostics; namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} /*发送消息的结构,与主进程一样*/
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; } /*发送消息的类型,与主进程一样*/
const int WM_COPYDATA = 0x004A; /*通过这个方法,可以找到主进程的窗体*/
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName); /*发送消息的结构体*/
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd,
int Msg,
int wParam,
ref COPYDATASTRUCT lParam
); private void button1_Click(object sender, EventArgs e)
{
/*C#进程通信(Server): 主进程的tilte*/
int WINDOW_HANDLER = FindWindow(null, @"C#进程通信(Server)");
if (WINDOW_HANDLER == )
{
}
else
{
int age = ;
byte[] sarr = System.Text.Encoding.Default.GetBytes("hello,world");
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)age;
cds.lpData = "hello,world";
cds.cbData = len + ;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, , ref cds); }
} }
}

  3.主要事项:

  ①.因为FindWindow这个方法是用来找到窗体的,所以server端一定要是winform程序,client可以是winform,也可以是控制台

  ②.当把发送消息的方法,放在循环中的时候,会降低程序的性能。上千或上万次的循环,效果会非常明显。

  ③.不需要引入其他的dll,直接原生态

c#利用VM_COPYDATA实现进程间通信的更多相关文章

  1. 【Android】17.5 利用Messenger实现进程间通信(IPC)

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenge ...

  2. 利用WM_COPYDATA进行进程间通信

    发信消息 void CControlDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 CString strWindowTitle = _T ...

  3. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  4. Windows的进程间通信

    对于任何一个现代的操作系统,进程间通信都是其系统结构的一个重要组成部分.而说到Windows的进程(线程)间通信,那就要看是在什么意义上说了.因为正如"Windows的跨进程操作" ...

  5. Android Service使用拾遗[阿里工程师分享]

    Service作为android的四大组件之一常用来帮助我们完成一些需要放在后台处理的任务,通过startService和bindService两种方式被调用.因为Service也是在主线程中运行的, ...

  6. Linux--管道pipe

    管道是一种最基本的IPC机制,由pipe函数创建:#include <unistd.h>
int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区(称为 ...

  7. python 闯关之路四(下)(并发编程与数据库编程)

    并发编程重点: 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别.互斥锁.信号. 事件.join.GIL.进程间通信.管道.队列. 生产者消息者模型.异步模 ...

  8. IPC_管道

    1.管道特点: 1)单向数据通信 2)匿名管道-常用于(父子进程/有血缘关系的进程之间) 3)命名管道-常用于(无血缘关系进程之间通信) 4)提供一种流式服务(发送和接受不接受字节数的大小,可取任意大 ...

  9. 【Android】17.0 第17章 服务绑定—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 通过服务绑定(Bound Services),可以轻松实现后台服务与界面(UI)的交互. 二.本章示例主界面 1. ...

随机推荐

  1. 使用VS Code开发Angular 2应用程序所需配置文件的解析

    目录 package.json typings.json tsconfig.json launch.json settings.json tasks.json package.json: 这是项目的基 ...

  2. (转) CS0234: 命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Ajax”(是否缺少程序集引用?)

    从SVN上down下来的程序,编译报了一大堆的错,发现是缺少引用,但是明明引用了,后来打开引用,发现system.web.mvc这个引用打着叹号,如图, 后来重新引用了本机的system.web.mv ...

  3. Android -------- 用XmlPullParser解析器解析XML文件

  4. ViewPager欢迎页

    布局  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...

  5. .net Signalr 使用笔记

    官方参考地址:http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 1.服务器端可以是控制台.winfor ...

  6. [转载]C++ 堆与栈简单的介绍

    在C和C++中,有三种使用存储区的基本方式: [静态存储区(Static   Memory)] 在静态存储区中,连接器(linker)根据程序的需求为对象分配空间.全局变量.静态类成员以及函数中的静态 ...

  7. uva 296 - Safebreaker

    枚举法 #include <cstdio> using namespace std; int main() { int t, n, i, j, k; scanf("%d" ...

  8. js图片实时加载

    浏览大型网站,特别是图片比较多的图片,如大型的电商网站,你会发现处了第一屏外,往下滚动的时候图片才加载出来,没必要一开始加载就要把全部图片加载出来,这样子打开网面的速度得到了很好提高.以下是笔者目前所 ...

  9. windows下配置lamp环境(5)---配置MySQL5.6

    开始配置mysql 1.创建配置文件my.ini   1.进入C:\wamp\MySQL   2.把my-default.ini 另存一份:my.ini   3.开始编辑mysql的配置文件,打开my ...

  10. About abstract class.

    Abstract means should be realized. Virtual means could be overrided. It is very different!