C#进程间通信

  • A+
所属分类:软件编程

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

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

二、利用API函数去找到进程窗口的句柄,然后用API去控制这个窗口。例如,导入“User32.dll”中的FindWindow、FindWindowEx函数查找窗口,并获取窗口句柄,也可直接利用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.exe和Form2.exe拷贝到同一目录下,启动Form2.exe:

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

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

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

 

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

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: