C# WinForm 借助Windows API 实现进程间通信
一、新建WinForm项目,WindowsFormsApp_ProcessA
界面,窗口添加了Load事件
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WindowsFormsApp_ProcessA
{
public partial class Form1 : Form
{
ProcessStartInfo info = new ProcessStartInfo();
Process pro = new Process();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
info.FileName = "E:\\projects_vs2019\\WindowsFormsApp\\WindowsFormsApp_ProcessA\\bin\\Debug\\WindowsFormsApp_ProcessB.exe";
pro.StartInfo = info;
}
/// <summary>
/// 启动被控进程ProcessB
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
pro.Start();
}
/// <summary>
/// 退出被控进程ProcessB
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
pro.Kill();
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="Msg">消息值</param>
/// <param name="wParam">参数一</param>
/// <param name="lParam">参数二</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wP, IntPtr lP);
/// <summary>
/// 向被控进程ProcessB发送消息按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
try
{
IntPtr hWnd = pro.MainWindowHandle; //获取Form1.exe主窗口句柄
String s = this.textBox1.Text;//消息内容
if (s == String.Empty) s = "0";
int data = Convert.ToInt32(s); //获取文本框数据
SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //发送WM_KEYDOWN消息
}
catch (Exception ex)
{
MessageBox.Show("只能给<启动被控进程ProcessB>按钮创建的窗口发送消息");
}
//点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息
}
//----------------------------------------------------------------------------------------
/// <summary>
/// 定义结构体
/// </summary>
public struct COPYDATASTRUCT
{
public IntPtr dwData; //可以是任意值
public int cbData; //指定lpData内存区域的字节数
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; //发送给目录窗口所在进程的数据
}
/// <summary>
/// 查找窗口
/// </summary>
/// <param name="lpClassName">窗口类名</param>
/// <param name="lpWindowName">窗口标题</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// 发送消息
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="Msg">消息值</param>
/// <param name="wParam">参数一</param>
/// <param name="lParam">参数二</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
/// <summary>
/// 定义消息值
/// </summary>
private const int WM_COPYDATA = 0x004A; //必须是这个数值,不能更改
/// <summary>
/// 查找窗口发送消息按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
int hWnd = FindWindow(null, this.textBox2.Text);//窗口标题
if (hWnd == 0)
{
MessageBox.Show("未找到标题为 "+this.textBox2.Text+" 的窗口");
}
else
{
string sendString = textBox1.Text; //发送内容
byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)0;
cds.cbData = len + 1;
cds.lpData = sendString;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
}
}
}
}
二、新建WinForm项目,WindowsFormsApp_ProcessB
窗口控件只有一个label,窗口添加了 KeyDown事件
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp_ProcessB
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
this.label1.Text = Convert.ToString(e.KeyValue);
}
//-------------------------------------------------------------------------
/// <summary>
/// 定义结构体
/// </summary>
public struct COPYDATASTRUCT
{
public IntPtr dwData; //可以是任意值
public int cbData; //指定lpData内存区域的字节数
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStr)]
public string lpData; //发送给目录窗口所在进程的数据
}
/// <summary>
/// 定义消息值
/// </summary>
private static int WMA_InterPro = 0x004A;
protected override void DefWndProc(ref Message m)
{
if (m.Msg == WMA_InterPro)
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type t = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(t);
string receiveInfo = cds.lpData; //接收内容
label1.Text = receiveInfo;
}
else
{
base.DefWndProc(ref m);
}
}
}
}
C# WinForm 借助Windows API 实现进程间通信相关推荐
- Windows API 进程间通信,管道(Pipe)
2019独角兽企业重金招聘Python工程师标准>>> 转载自:Windows API 进程间通信,管道(Pipe) 管道是一种用于在进程间共享数据的机制,其实质是一段共享内存.Wi ...
- C++ WINDOWS API 第2章 Windows API概要
目录 2.1 Windows数据类型.. 1 2.1.1 Windows数据类型示例.. 1 2.1.2 Windows 数据类型与标准C 数据类型的关系.. 5 ...
- 10、Windows API 文件系统
一.基本概念 1.磁盘分区(Partitions) 磁盘是装到计算机上的存储设备,比如常见的硬盘.磁盘分区是为了便于管理和使用物理硬盘,而在一个物理硬盘上划分可以各自独立工作的一些逻辑磁盘.比如一块8 ...
- lua运行外部程序_Lua通过COM调用外部程序excel及调用windows api
[在我接触JNA之前一直以为调用本地链接库函数的时候一定要借助JNI或者SWT来实现,一日中无意看到JNA,发现它也可以实现这类调用,于是下回来按网站上的例子试试了 还不错, 为了方便起见,最好安装l ...
- 标准C函数库头文件、POSIX标准库头文件和Windows API函数库头文件说明
1. 标准C函数库头文件 名字 源自 描述 <assert.h> 包含断言宏,被用来在程序的调试版本中帮助检测逻辑错误以及其他类型的bug. <complex.h> C99 一 ...
- Windows API详情
Windows API详情 原文链接:https://docs.microsoft.com/zh-cn/windows/desktop/apiindex/windows-api-list 桌面和服务器 ...
- OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 非通信方式的子进程获取父进程信息
OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 进程相关 目录 一.得到父进程ID(Process32First ...
- Windows API(三)线程
Windows API笔记(一)内核对象 Windows API笔记(二)进程和进程间通信.进程边界 Windows API笔记(三)线程和线程同步.线程局部存储 Windows API笔记(三)线程 ...
- 猎豹网校Windows API 学习指南(价值990元)
Windows API是微软开发的应用程序编程接口,是一系列函数.宏.数据类型.数据结构的集合,微软的Windows就是使用Windows API开发出来的,我们要开发Windows应用程序,学习Wi ...
最新文章
- Chapter 2 Open Book——29
- linux下打印机共享及监控
- 再见,Python!!
- StoreFront 2.5让XenDesktop和XenApp如虎添翼
- Python读取文本的三种方式对比
- autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
- Python 文件操作中的读写模式:open(path, ‘-模式-‘,encoding=‘UTF-8‘)+python读写文件txt +文本数据预处理
- 全球最大多人在线创作游戏Roblox暂时关闭 官方称将尽快恢复运行
- dev里timeedit控件如何赋值_如何制作高逼格的数据地图(二)
- MVP项目框架搭建-高级设计
- mac 下安装android studio(转)
- 如何在Windows下载pygame
- vmware workstation server 服务无法启动
- android webview下载附件几种方法
- ant-desigh+prolayout布局,修改面包屑的分隔符号,百度搜遍了都找不到办法,csdn解决了
- mc:Ignorable=d什么意思?
- 图解IE浏览器下,如何保存输入记录
- Nesssus Pro 8.13.1下载安装
- UVa 1616 商队抢劫者(Caravan Robbers)
- 阿里云ACA认证到底是什么?