C#进程间通信(简单高效)

C#进程间通信

 

目前,网上关于C#进程间通信的方法有很多种,但是总结起来它们不外乎从以下两个方面进行考虑

一、在两个进程之间建立一个共同区域,其中一个进程改变这个区域的内容,而另一个进程则去读取它,反之亦然。比如,可以让两个进程共享同一块内存,通过改变和读取内存中的内容进行通信;或者,创建一个文件,两个进程同时占用,甚至可以利用注册表或者剪贴板充当这个“共同区域”。

二、利用API函数去找到进程窗口的句柄,然后用API去控制这个窗口。例如,导入“User32.dll”中的FindWindowFindWindowEx函数查找窗口,并获取窗口句柄,也可直接利用C#中的Process类来启动程序,并获取这个进程的主窗口的句柄,等等。

 

在编程时,我们往往需要选择一种即方便编写,效率又高的程序。第一种类型相对比较复杂,而且效率不高,相比来讲,第二种类型在不降低程序运行效率的情况下编写更简单。下面我就以一个示例程序来讲解如何使用Process类和API实现两个进程之间的传输数据。

 

第一步:

 

1)打开VS2005,新建一个“windows 应用程序”,主窗口为Form1

2)在Form1上添加一个标签label1,并为Form1添加KeyDown事件,当Form1接收到KewDown消息时,将接收到的数据显示在label1上。

        private void Form1_KeyDown(objectsender, KeyEventArgs e)

       {

           this.label1.Text = Convert.ToString(e.KeyValue);

       }

3)编译运行,生成Form1.exe

 

第二步:

 

1)打开VS2005,新建一个“windows 应用程序”,主窗口为Form2,并在Form2上添加三个按钮和一个文本框,分别为button1,button2,button3,textbox1

2)在Form2.cs中添加引用:

 

using System.Diagnostics;

using System.Runtime.InteropServices;

 

     并导入Win32 API函数:

 

[DllImport("User32.dll", EntryPoint ="SendMessage")]

          private static extern int SendMessage(IntPtrwnd,int msg,IntPtr wP,IntPtr lP);

 

3)在Form2类中定义以下两个变量

 

       ProcessStartInfo info = new ProcessStartInfo();

       Process pro = new Process();

 

4)为Form2添加Load事件响应

 

private void Form1_Load(object sender, EventArgs e)

       {

           info.FileName = "\\Form1.exe";

           pro.StartInfo = info;

       }

 

5)为button1,button2,button3分别添加click事件响应,并添加响应内容:

     Button1:   pro.Start();

     点击该按钮,启动Form1.exe程序

     Button2:   pro.Kill();

     点击该按钮,退出From1.exe程序

     Button3:  

IntPtr hWnd = pro.MainWindowHandle;          //获取Form1.exe主窗口句柄

          int data = Convert.ToInt32(this.textBox1.Text);     //获取文本框数据

          SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //发送WM_KEYDOWN消息

      点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息

6)编译运行,生成Form2.exe

 

第三步:

 

Form1.exeForm2.exe拷贝到同一目录下,启动Form2.exe

点击button1按钮,则Form1.exe启动

点击button2按钮,则Form1.exe退出

Form1.exe程序正在运行的情况下,在Form2窗口的文本框中输入任意数字并点击button3按钮,Form1窗口的label1即显示该数字。

 

以上只是简单的介绍了利用C#Process类和Win32 API函数实现进程之间的数据传输,读者可以根据实际情况举一反三,编写功能更加强大的程序。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值