c# 进程间通信

c# 进程间通信

一、进程间通讯的方式

进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。

二、发送消息实现进程间通讯前准备

下面的例子用到一个windows api 32函数

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

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

要有此函数,需要添加using System.Runtime.InteropServices;命名空间

此方法各个参数表示的意义

wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

msg:指定被发送的消息类型。

wP:消息内容。

lP:指定附加的消息指定信息。

用api参考手册查看SendMessage用法时,参考手册则提示

SendMessage与PostMessage之间的区别:SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息,但是SendMessage() 函数发出消息后一直等到接收方的消息响应函数处理完之后才能返回,并能够得到返回值,在此期间发送方程序将被阻塞,SendMessage() 后面的语句不能被继续执行,即是说此方法是同步的。而PostMessage() 函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。

三、发送消息实现进程间通讯具体步骤

1.新建windows应用程序

(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication

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

public Form1()

{

InitializeComponent();

this.KeyDown+=new KeyEventHandler(Form1_KeyDown);

}

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

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

}

(3)编译运行,生成ProcessCommunication.exe

2.新建windows应用程序

(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication1,

并在Form1上添加一个按钮和一个文本框

namespace ProcessCommunication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

//Win32 API函数:

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

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

private void button1_Click(object sender, EventArgs e)

{

Process[] pros = Process.GetProcesses(); //获取本机所有进程

for (int i = 0; i

{

if (pros[i].ProcessName == "ProcessCommunication") //名称为ProcessCommunication的进程

{

IntPtr hWnd = pros[i].MainWindowHandle; //获取ProcessCommunication.exe主窗口句柄

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

SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息

}

}

}

}

}

3.启动ProcessCommunication.exe可执行文件,弹出Form1窗体称为接受消息窗体。

启动ProcessCommunication1.exe可执行文件,在弹出的窗体中的文本框中输入任意数字,点击button1按钮,接受消息窗体textBox1即显示该数字。

到此结束。

c# 进程间通信

一、进程间通讯的方式

进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。

二、发送消息实现进程间通讯前准备

下面的例子用到一个windows api 32函数

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

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

要有此函数,需要添加using System.Runtime.InteropServices;命名空间

此方法各个参数表示的意义

wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

msg:指定被发送的消息类型。

wP:消息内容。

lP:指定附加的消息指定信息。

用api参考手册查看SendMessage用法时,参考手册则提示

SendMessage与PostMessage之间的区别:SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息,但是SendMessage() 函数发出消息后一直等到接收方的消息响应函数处理完之后才能返回,并能够得到返回值,在此期间发送方程序将被阻塞,SendMessage() 后面的语句不能被继续执行,即是说此方法是同步的。而PostMessage() 函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。

三、发送消息实现进程间通讯具体步骤

1.新建windows应用程序

(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication

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

public Form1()

{

InitializeComponent();

this.KeyDown+=new KeyEventHandler(Form1_KeyDown);

}

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

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

}

(3)编译运行,生成ProcessCommunication.exe

2.新建windows应用程序

(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication1,

并在Form1上添加一个按钮和一个文本框

namespace ProcessCommunication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

//Win32 API函数:

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

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

private void button1_Click(object sender, EventArgs e)

{

Process[] pros = Process.GetProcesses(); //获取本机所有进程

for (int i = 0; i

{

if (pros[i].ProcessName == "ProcessCommunication") //名称为ProcessCommunication的进程

{

IntPtr hWnd = pros[i].MainWindowHandle; //获取ProcessCommunication.exe主窗口句柄

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

SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息

}

}

}

}

}

3.启动ProcessCommunication.exe可执行文件,弹出Form1窗体称为接受消息窗体。

启动ProcessCommunication1.exe可执行文件,在弹出的窗体中的文本框中输入任意数字,点击button1按钮,接受消息窗体textBox1即显示该数字。

到此结束。


相关文章

  • 特洛伊木马程序的设计与实现
  • 目录 第一章 绪论 .............................................................................................................. ...查看


  • 龙图教育:C#导入Excel数据的两种方式
  • C#导入Excel数据的两种方式 方式一.导入数据到数据集对象,只支持Excel的标准格式,即不能合并单元格等等 /// /// 导入数据到数据集中 /// 备注:此种方法只支持excel原文件 /// /// /// /// public ...查看


  • 为何要学编程
  • 一.为何要学编程? 每个人的动机不一样.大致有: 1.为了找个好工作:或为了有更好的机会和更好的发展. 2.看到别人超厉害,所以也想学. 3.实际工作中很多场合需要. 4.从小就立志做个程序员,做软件工程师. 5.振兴中国的软件事业. .. ...查看


  • 企业信息系统运行状态监控与管理
  • 企业信息系统运行状态监控与管理的信息化 在企业内部运行着许多信息系统,信息系统管理员的主要工作之一就是负责这些系统的运行状态监控与管理,这也是信息系统管理员的日常工作.然而在实际工作中,系统管理员往往疏于日常监控与管理,只是在出现故障时才疲 ...查看


  • aspnet 二手闲置物品置换交易管理系统
  • 摘 要 在信息高度发达的网络时代,物品置换管理系统在本系统开发中,起到了举足轻重的作用.它使用当今信息高度发展的时代,加强用户网上信息的交流与分享,系统采用B/S开发模式就是能够使用信息的传输与信息的处理,方便用户解决自身业务问题,给用户网 ...查看


  • 混凝土搅拌站自动控制系统
  • 混凝土搅拌站自动控制系统 1. 项目简介 混凝土搅拌站是基础设施建设中不可或缺的生产设 备,同时又是一个由多环节组成的复杂控制系统.在混凝土的生产中,配料的称量精度.配料的施工配比.原材料的含水率与供水量等直接影响混凝土的质量,除此之外,控 ...查看


  • 联通笔试题
  • 选择题 1.通信网的基本结构形式有五种,以下正确的说法是(C) A.网型.星型.树型.环型.总线型: B.网型.星型.线型.复合型.环型: C.网型.星型.复合型.环型.总线型: D.网型.环型.线型.复合型.树型. 2.N个节点完全互联的 ...查看


  • 网上书店管理系统的设计与实现111111
  • 安徽职业技术学院 毕 业 论 文 课题名称: 学生姓名: 学 号 : 专 业: 班 级: 指导教师: 2012年5 月 1 目 录 一.需求分析„„„„„„„„„„„„„„„„„„„„„„„„„„„„4 1.1开发该系统的依据及意义„„„„ ...查看


  • C#控件属性大全
  • Control 类中定义的基础控件属如下(注意 属性名称并不完全一致): 1.AllowDrop 属性:以确定控件是否接受用户的拖动.如果允许其属性值为true ,否我false (默认值).对于 RichTextBox控件,本属性中是为f ...查看


热门内容