注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

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

2011-09-30 16:05:00|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

目前,网上关于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函数实现进程之间的数据传输,读者可以根据实际情况举一反三,编写功能更加强大的程序。

  评论这张
 
阅读(2205)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017