C#进程间通信.pdf

上传人:索**** 文档编号:76242391 上传时间:2023-03-08 格式:PDF 页数:5 大小:16.46KB
返回 下载 相关 举报
C#进程间通信.pdf_第1页
第1页 / 共5页
C#进程间通信.pdf_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《C#进程间通信.pdf》由会员分享,可在线阅读,更多相关《C#进程间通信.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C#进程间通信目前,网上关于C#进程间通信的方法有很多种,但是总结起来它们不外乎从以下两个方面进行考虑一、在两个进程之间建立一个共同区域,其中一个进程改变这个区域的内容,而另一个进程则去读取它,反之亦然。比如,可以让两个进程共享同一块内存,通过改变和读取内存中的内容进行通信;或者,创建一个文件,两个进程同时占用,甚至可以利用注册表或者剪贴板充当这个“共同区域”。二、利用API 函数去找到进程窗口的句柄,然后用API 去控制这个窗口。例如,导入“User32.dll”中的FindWindow、FindWindowEx函数查找窗口,并获取窗口句柄,也可直接利用 C#中的 Process类来启动程序

2、,并获取这个进程的主窗口的句柄,等等。在编程时,我们往往需要选择一种即方便编写,效率又高的程序。第一种类型相对比较复杂,而且效率不高,相比来讲,第二种类型在不降低程序运行效率的情况下编写更简单。下面我就以一个示例程序来讲解如何使用Process类和 API 实现两个进程之间的传输数据。第一步:(1)打开 VS2005,新建一个“windows 应用程序”,主窗口为Form1(2)在 Form1 上添加一个标签label1,并为 Form1 添加 KeyDown 事件,当Form1 接收到KewDown 消息时,将接收到的数据显示在label1 上。private void Form1_KeyD

3、own(object sender,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 函

4、数:DllImport(User32.dll,EntryPoint=SendMessage)private static extern int SendMessage(IntPtr wnd,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.FileNa

5、me=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,0 x0100

6、,(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#的 P

7、rocess类和 Win32 API 函数实现进程之间的数据传输,读者可以根据实际情况举一反三,编写功能更加强大的程序。c#进程间通信在 Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有1、使用内存映射文件2、通过共享内存DLL共享内存3、使用 SendMessage向另一进程发送WM_COPYDATA消息比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过 WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendM

8、essage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:这个函数的原型及其要用到的结构如下:SendMessage(hwnd,WM_COPYDATA,wParam,lParam);其中,WM_COPYDATA对应的十六进制数为0 x004A wParam设置为包含数据的窗口的句柄。lParam 指向一个 COPYDATASTRUCT的结构:typedef struct tagCOPYDATASTRUCT DWORD dwData;/用户定义数据DWORD cbData;/数据大小PVOID lpData;/指向数据的指针COPYDATASTRUCT;该结构用来定义用户

9、数据。具体过程如下:首先,在发送方,用 FindWindow 找到接受方的句柄,然后向接受方发送WM_COPYDATA消息.接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚./发送端using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.

10、InteropServices;namespace SendTest public partial class Form1:Form public Form1()InitializeComponent();this.Text=发送窗口;const int WM_COPYDATA=0 x004A;public struct COPYDATASTRUCT public IntPtr dwData;public int cbData;MarshalAs(UnmanagedType.LPStr)public string lpData;DllImport(user32,EntryPoint=SendM

11、essage)private static extern int SendMessage(int hwnd,int Msg,int wParam,ref COPYDATASTRUCT IParam);DllImport(user32,EntryPoint=FindWindow)private static extern int FindWindow(string lpCLassName,string lpWindowName);private void button1_Click(object sender,EventArgs e)int WINDOW_HANDLE=FindWindow(nu

12、ll,接收窗口);if(WINDOW_HANDLE!=0)byte sarr=System.Text.Encoding.Default.GetBytes(this.textBox1.Text);int len=sarr.Length;COPYDATASTRUCT cds;cds.dwData=(IntPtr)100;cds.lpData=this.textBox1.Text;cds.cbData=len+1;SendMessage(WINDOW_HANDLE,WM_COPYDATA,0,ref cds);/接收端using System;using System.Collections.Gen

13、eric;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace ReceiveTest public partial class Form1:Form public Form1()InitializeComponent();this.Text=接收窗口;const int WM_COPYDATA=0 x004A;public stru

14、ct COPYDATASTRUCT public IntPtr dwData;public int cbData;MarshalAs(UnmanagedType.LPStr)public string lpData;protected override void DefWndProc(ref Message m)/base.DefWndProc(ref m);switch(m.Msg)case WM_COPYDATA:COPYDATASTRUCT myStr=new COPYDATASTRUCT();Type myType=myStr.GetType();myStr=(COPYDATASTRUCT)m.GetLParam(myType);this.textBox1.Text=myStr.lpData;break;default:base.DefWndProc(ref m);break;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术标书

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁