一、进程间通讯的方式

进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存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 < pros.Length; 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#使用SendMessage实现进程间通信的方法

本文实例讲述了C#使用SendMessage实现进程间通信的方法。分享给大家供大家参考。具体分析如下:

为了深入理解消息机制,先来做一个测试项目

在新建项目的Form1的代码中,加入方法:

1

2

3

4

5

6

7

8

9

10

11

protected override void DefWndProc(ref Message m)

{

  if (m.Msg == 0x200)

  {

   MessageBox.Show("捕捉到消息");

  }

  else

  {

  }

  base.DefWndProc(ref m);

}

此方法重写了窗体的消息截获代码,运行后会发现,鼠标一移向窗体就会弹窗

对于一个可视控件来说,是不断的在接受系统发送的消息的。比如鼠标悬停在某某控件上,就是一个消息,移出这个控件又是一个消息。如示例所示,其实鼠标移入窗体,窗体就获得了一个消息,无论你写没写过代码,它都获得了这个消息,一个消息对应触发一个事件,编写了事件代码,就会执行相应的代码操作。

事件里编写的代码,和方法里写的代码,最主要的不同就在于前者是不知道何时触发,而后者是自己调用运行到那里就执行的。

那谁来决定某个事件何时触发呢?那就是消息

示例中的0x200是一个消息类型,代表了鼠标移入窗体这个消息

现在讨论一下如何利用这种消息机制来在进程之间传递值

需求:

程序A的主窗体里有一个全局变量

程序B的主窗体里有一个按钮,点击这个按钮,获取到程序A的这个变量

实现:

1. 新建一个解决方案,是程序A,窗体后台代码重写DefWndProc

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public partial class Form1 : Form

{

  public Form1()

  {

   InitializeComponent();

  }

  private void Form1_Load(object sender, EventArgs e)

  {

  }

  protected override void DefWndProc(ref Message m)

  {

   if (m.Msg == 0x104)

   {

    m.Result = (IntPtr)333;

    return;

       }

   else

   {    

   }

   base.DefWndProc(ref m);

  }

}

2. 新建一个解决方案,程序B,

1

2

3

4

5

6

7

8

9

10

11

12

public Form1()

{

 InitializeComponent();

}

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

private static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

private void button2_Click(object sender, EventArgs e)

{

 Process[] arrPro = Process.GetProcessesByName("WindowsFormsApplication1.vshost");

 IntPtr ip = SendMessage(arrPro[0].MainWindowHandle, 0x104, 1, 2);

}

这样,在按钮点击的时候,会向A发送一个消息,消息类型是104,两个参数1和2,A能捕获到,设置结果为333,那最后在B中的ip的值就是333

C#中进程间通信方式汇总相关推荐

  1. 【进程间通信】进程间通信方式汇总

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1.管道模型 1.1 匿名管道 1.2 命名管道 2.消息队列 2.1 创建消息队 ...

  2. python中进程间通信方式总结

    一.管道 二.消息队列 三.共享内存 一.python中进程间通过管道的方式进行通信.创建一个管道,在进程的一端发送消息,在进程的另一端接收消息,通过这个内置的方法实现通信.一端发出消息,另一端接收消 ...

  3. Android中进程间通信(IPC)方式总结

    IPC为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程.在PC和移动设备上一个进程指的是一个程序或者一个应用,所以我们可以将进程间通信简单理解为不同应用之间的通信,当然这种说法并不严谨. 在 ...

  4. 面试中常被问到的(16)进程间通信方式

    Linux下进程间通信方式主要包括:信号,管道,信号量,消息队列,共享内存,socket 信号: 是一种事件通知机制,或者说是一种事件中断机制,通过信号通知当前进程发生了什么事件,中断进程当前操作去执 ...

  5. dat关闭某进程_超详细解析!工程师必会的Linux进程间通信方式和原理

    ▍进程的概念 · 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. ▍进程通信的概念 · 进 ...

  6. TCP/UDP编程中的问题汇总

    TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...

  7. ❗HTML引入JavaScript的三种常用方式汇总❗

    引言 JavaScript是一门脚本语言,虽然名字里有Java,但是和Java没有一点关系,它原名是LiveScript:现在的前端JavaScript可以说是异常火爆,但是博主本人并不准备向前端发展 ...

  8. 两个不同的进程 虚拟地址相同_记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了...

    1 管道 学习软件工程规范的时候,我们知道瀑布模型,在整个项目开发过程分为多个阶段,上一阶段的输出作为下一阶段的输入.各个阶段的具体内容如下图所示 最初我们在学习Linux基本命令使用的时候,我们经常 ...

  9. Android带三角形的弹窗,Android实现三角形气泡效果方式汇总

    在开发过程中,我们可能会经常遇到这样的需求样式: 这张图是截取京东消息通知的弹出框,我们可以看到右上方有个三角形的气泡效果,这只是其中一种,三角形的方向还可以是上.下.左.右. 通过截图可以发现,气泡 ...

最新文章

  1. 全球AI初创公司去年融资创新纪录:总额逾266亿美元超2200笔交易
  2. 数据绑定设计器的使用
  3. php导出页面word,php导出生成word的方法_PHP
  4. ML之NN:利用神经网络的BP算法解决XOR类(异或非)问题(BP solve XOR Problem)
  5. BADI EXIT等增强报W警告类消息
  6. 交互式计算机图形学总结:第五章 光照和明暗绘制
  7. Java 匿名存储过程_Java程序员的存储过程
  8. Eclipse里做JBPM工作流gpd.xml中文乱码问题解决(包括控制台乱码解决)
  9. Python数据结构和算法
  10. 【数据结构与算法】排序 冒泡、插入、选择 O(n^2)
  11. mysql运维技巧_​mysql初级运维使用技巧
  12. 【转】惹恼程序员的十件事
  13. SQL Server 2005 中行号的显示,分页
  14. exe变计算机病毒,文件夹变exe病毒怎么恢复 文件夹exe病毒的解决方法
  15. 阿里云oss中解决IE浏览器下载中文文件时乱码问题
  16. 2022-2028全球与中国纳米保湿美容仪市场现状及未来发展趋势
  17. 蓝桥杯评分标准_蓝桥杯软件设计大赛自测评分标准
  18. 计算机毕业设计Node.js+Vue交通违章举报平台(程序+源码+LW+部署)
  19. PXE自动安装Linux系统
  20. PhpStorm中实现代码自动换行

热门文章

  1. 模拟量采集非线性函数(真空度计算)
  2. NO9 Linux快捷键整理及最常用命令
  3. 将汉字和字母转换为Unicode码
  4. video在某些浏览器默认静音
  5. 人工智能导论(2)——知识表示(Knowledge Representation)
  6. linux 新建中文文件夹,linux中文文件夹如何改回英文
  7. Jquery实现广告滚动
  8. 洛谷 - P1199 三国游戏 (博弈论)
  9. 记录:配置tf-openpose环境爬过的那些坑
  10. 百度直播:个体商户、品牌商家618购物节的流量新通路