一、新建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 实现进程间通信相关推荐

  1. Windows API 进程间通信,管道(Pipe)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:Windows API 进程间通信,管道(Pipe) 管道是一种用于在进程间共享数据的机制,其实质是一段共享内存.Wi ...

  2. C++ WINDOWS API 第2章 Windows API概要

    目录 2.1       Windows数据类型.. 1 2.1.1       Windows数据类型示例.. 1 2.1.2       Windows 数据类型与标准C 数据类型的关系.. 5 ...

  3. 10、Windows API 文件系统

    一.基本概念 1.磁盘分区(Partitions) 磁盘是装到计算机上的存储设备,比如常见的硬盘.磁盘分区是为了便于管理和使用物理硬盘,而在一个物理硬盘上划分可以各自独立工作的一些逻辑磁盘.比如一块8 ...

  4. lua运行外部程序_Lua通过COM调用外部程序excel及调用windows api

    [在我接触JNA之前一直以为调用本地链接库函数的时候一定要借助JNI或者SWT来实现,一日中无意看到JNA,发现它也可以实现这类调用,于是下回来按网站上的例子试试了 还不错, 为了方便起见,最好安装l ...

  5. 标准C函数库头文件、POSIX标准库头文件和Windows API函数库头文件说明

    1. 标准C函数库头文件 名字 源自 描述 <assert.h> 包含断言宏,被用来在程序的调试版本中帮助检测逻辑错误以及其他类型的bug. <complex.h> C99 一 ...

  6. Windows API详情

    Windows API详情 原文链接:https://docs.microsoft.com/zh-cn/windows/desktop/apiindex/windows-api-list 桌面和服务器 ...

  7. OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 非通信方式的子进程获取父进程信息

    OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 进程相关 目录 一.得到父进程ID(Process32First ...

  8. Windows API(三)线程

    Windows API笔记(一)内核对象 Windows API笔记(二)进程和进程间通信.进程边界 Windows API笔记(三)线程和线程同步.线程局部存储 Windows API笔记(三)线程 ...

  9. 猎豹网校Windows API 学习指南(价值990元)

    Windows API是微软开发的应用程序编程接口,是一系列函数.宏.数据类型.数据结构的集合,微软的Windows就是使用Windows API开发出来的,我们要开发Windows应用程序,学习Wi ...

最新文章

  1. Chapter 2 Open Book——29
  2. linux下打印机共享及监控
  3. 再见,Python!!
  4. StoreFront 2.5让XenDesktop和XenApp如虎添翼
  5. Python读取文本的三种方式对比
  6. autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
  7. Python 文件操作中的读写模式:open(path, ‘-模式-‘,encoding=‘UTF-8‘)+python读写文件txt +文本数据预处理
  8. 全球最大多人在线创作游戏Roblox暂时关闭 官方称将尽快恢复运行
  9. dev里timeedit控件如何赋值_如何制作高逼格的数据地图(二)
  10. MVP项目框架搭建-高级设计
  11. mac 下安装android studio(转)
  12. 如何在Windows下载pygame
  13. vmware workstation server 服务无法启动
  14. android webview下载附件几种方法
  15. ant-desigh+prolayout布局,修改面包屑的分隔符号,百度搜遍了都找不到办法,csdn解决了
  16. mc:Ignorable=d什么意思?
  17. 图解IE浏览器下,如何保存输入记录
  18. Nesssus Pro 8.13.1下载安装
  19. UVa 1616 商队抢劫者(Caravan Robbers)
  20. 阿里云ACA认证到底是什么?

热门文章

  1. 微信文本信息a标签无效
  2. 使用DataRobot和Databricks简化大数据和AI
  3. 人加智能FPGA应用实践-AI快速进化
  4. Unity接入穿山甲广告SDK(以及GroMoreDemo)
  5. C++标准模板库(STL)学习精要,看此文再配合参考手册轻松成高手!
  6. 人脸识别门禁系统在疫情后的世界中的重要性
  7. 老子《道德经》第五十七章
  8. 贝壳私房钱带我走出生活舒适区
  9. ubuntu18里用python编写modbus-RTS
  10. 第五周项目3-对象数组操作长方体类