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
转自-https://www.jb51.net/article/65102.htm
C#使用SendMessage实现进程间通信的方法的更多相关文章
- MFC sendmessage实现进程间通信
用sendmessage实现进程间通信. 1.WM_COPYDATA实现进程间通信 实现方式是发送WM_COPYDATA消息. 发送程序: LRESULT copyDataResult; //copy ...
- [Android]进程间通信的方法
一.管道 管道是进程间通信中最古老的方式,它包括 无名管道 和 有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信. 无名管道由pipe()函数创建. #i ...
- 使用SendMessage进行进程间通信
Imports System.Runtime.InteropServices Public Class Monitor <DllImport("user32.dll", Ch ...
- windows下进程间通信的(13种方法)
转自:http://blog.csdn.NET/shiqz/article/details/5862936 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进 ...
- VC/MFC 进程间通信方法总结
摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程 / 多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的. M ...
- windows下进程间通信方法
摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...
- Unity3D中的SendMessage使用(消息传递的三种方法)
概述 Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种伪监听者模式,利用的是反射机制. 常用函数 关于消息推送,常用的函数有三个:”SendMessage“.”SendMessa ...
- windows进程间通信 .
摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microso ...
- windows下进程间通信(转)
摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...
随机推荐
- WINRAR4.2破解方式或注册码
急求WINRAR4.2破解方式或注册码,谢谢大侠们!~ 亲,我是复制别个的但是可以用64位32位都可以用 自己动手破解 那感觉才棒! 来吧 将以下数据复制到记事本中 然后另存名为“rarreg.key ...
- bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...
- CentOS7安装wget 及配置
yum -y install wget yum -y install setup yum -y install perl
- Spring 与 @Resource注解
Spring 中支持@Autowired注解,能够实现bean的注入.同时,Spring 也支持@Resource注解,它和@Autowired类似,都是实现bean的注入.该注解存在javax.an ...
- Oracle存储过程返回
IF IN_DN_NUMBER IS NOT NULL THEN SELECT COUNT(*) INTO V_HAS FROM SALEFROMSTORE WHERE ORDERID = IN_DN ...
- 机器学习:SVM(目标函数推导:Hard Margin SVM、Soft Margin SVM)
一.Hard Margin SVM SVM 的思想,最终用数学表达出来,就是在优化一个有条件的目标函数: 此为 Hard Margin SVM,一切的前提都是样本类型线性可分: 1)思想 SVM 算法 ...
- 2015.1.4 判断鼠标点击DataGridView的第几行还是空白处
public int GetRowIndexAt(int mouseLocation_Y) { if (dvaw.FirstDisplayedScrollingRowIndex < 0) { r ...
- nginx 添加win 服务
https://jingyan.baidu.com/article/0964eca279aa818285f536a9.html
- 用原生JS和html5进行视频截图并保存到本地
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Result Maps、Auto-mapping、cache
1. Result Maps resultMap元素是Mybatis里面最重要的并且功能最强大的一个元素.(The resultMapelement is the most important an ...