C#进程间通信,传递消息给其它窗口

来源:互联网 发布:2016中日贸易数据 编辑:程序博客网 时间:2024/05/20 23:36

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


一、在两个进程之间建立一个共同区域,其中一个进程改变这个区域的内容,而另一个进程则去读取它,反之亦 然。比如,可以让两个进程共享同一块内存,通过改变和读取内存中的内容进行通信;或者,创建一个文件,两个进程同时占用,甚至可以利用注册表或者剪贴板充当这个“共同区域”。
二、利用API函数去找到进程窗口的句柄,然后用API去控制这个窗口。例如,导入“User32.dll”中的FindWindow、FindWindowEx函数查找窗口,并获取窗口句柄,也可直接利用C#中的Process类来启动程序,并获取这个进程的主窗口的句柄,等等。
在编程时,我们往往需要选择一种即方便编写,效率又高的程序。第一种类型相对比较复杂,而且效率不高,相比来讲,第二种类型在不降低程序运行效率的情况下编写更简单。下面我就以一个示例程序来讲解如何使用Process类和API实现两个进程之间的传输数据。

 

 

第一步:
(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1
(2)在Form1上添加一个标签label1,并为Form1添加KeyDown事件,当Form1接收到KewDown消息时,将接收到的数据显示在label1上。

    public Form1()
    {
         InitializeComponent();

      ////////////////////添加KeyDown事件///////////////////
          KeyDown+=new KeyEventHandler(Form1_KeyDown);

    }

      /////////////////具体实现/////////////////////////////
    private void Form1_KeyDown(object sender, KeyEventArgs e)
     {
          this.label1.Text = Convert.ToString(e.KeyValue);
      }
(3)编译运行,生成Form1.exe

 

 

第二步:

(1)打开VS2008,新建一个“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(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);
(3)在Form2类中定义以下两个变量

     ProcessStartInfo psInfo = new ProcessStartInfo(@"..\..\..\Form1\bin\Debug\Form1.exe");
     Process pro = new Process();
(4)为Form2添加Load事件响应
     private void Form1_Load(object sender, EventArgs e)
     {
         pro.StartInfo = psInfo ;
     }

(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文件夹拷贝到与Form2同一目录下,启动Form2.exe:
     点击button1按钮,则Form1.exe启动
     点击button2按钮,则Form1.exe退出
     在Form1.exe程序正在运行的情况下,在Form2窗口的文本框中输入任意数字并点击button3按钮,Form1窗口的label1即显示该数字。
      以上只是简单的介绍了利用C#的Process类和Win32 API函数实现进程之间的数据传输,读者可以根据实际情况举一反三,编写功能更加强大的程序。

转载自:http://blog.sina.com.cn/s/blog_873a233e0100vop4.html

原创粉丝点击