winform 通过 windows api 实现本机两个exe 消息推送

两个winform.exe程序之间的通讯一发送消息

 

1,两个winform.exe在系统里体现是两个进程,而进程是是由系统管理。

2,user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。

3,所有可以通过调用user32.dll的api来进行两个进程之间的通信。

4,发送端exe.源码

        

  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.ComponentModel;
  4.  
    using System.Data;
  5.  
    using System.Drawing;
  6.  
    using System.Linq;
  7.  
    using System.Runtime.InteropServices;
  8.  
    using System.Text;
  9.  
    using System.Threading.Tasks;
  10.  
    using System.Windows.Forms;
  11.  
     
  12.  
    namespace Send
  13.  
    {
  14.  
     
  15.  
    public partial class Form1 : Form
  16.  
    {
  17.  
    public Form1()
  18.  
    {
  19.  
    InitializeComponent();
  20.  
    }
  21.  
    public struct CopyDataStruct
  22.  
    {
  23.  
    public IntPtr dwData;
  24.  
    public int cbData;
  25.  
     
  26.  
    [MarshalAs(UnmanagedType.LPStr)]
  27.  
     
  28.  
    public string lpData;
  29.  
    }
  30.  
     
  31.  
    public const int WM_COPYDATA = 0x004A;
  32.  
    //当一个应用程序传递数据给另一个应用程序时发送此消息指令
  33.  
     
  34.  
    //通过窗口的标题来查找窗口的句柄
  35.  
    [DllImport("User32.dll", EntryPoint = "FindWindow")]
  36.  
    private static extern int FindWindow(string lpClassName, string lpWindowName);
  37.  
     
  38.  
    //在DLL库中的发送消息函数
  39.  
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
  40.  
    private static extern int SendMessage
  41.  
    (
  42.  
    int hWnd, // 目标窗口的句柄
  43.  
    int Msg, // 在这里是WM_COPYDATA
  44.  
    int wParam, // 第一个消息参数
  45.  
    ref CopyDataStruct lParam // 第二个消息参数
  46.  
    );
  47.  
     
  48.  
    private void button1_Click(object sender, EventArgs e)
  49.  
    {
  50.  
     
  51.  
    //将文本框中的值, 发送给接收端
  52.  
    string text = textBox1.Text;
  53.  
    CopyDataStruct cds;
  54.  
    cds.dwData = (IntPtr)1; //这里可以传入一些自定义的数据,但只能是4字节整数
  55.  
    cds.lpData = text; //消息字符串
  56.  
    cds.cbData = System.Text.Encoding.Default.GetBytes(text).Length + 1;
  57.  
    //注意,这里的长度是按字节来算的
  58.  
    SendMessage(FindWindow(null, "接收端"), WM_COPYDATA, 0, ref cds);
  59.  
    // 这里要修改成接收窗口的标题“接收端”
  60.  
    }
  61.  
    }
  62.  
    }

5,接收端exe源码

  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.ComponentModel;
  4.  
    using System.Data;
  5.  
    using System.Drawing;
  6.  
    using System.Linq;
  7.  
    using System.Runtime.InteropServices;
  8.  
    using System.Text;
  9.  
    using System.Threading.Tasks;
  10.  
    using System.Windows.Forms;
  11.  
     
  12.  
    namespace Reserve
  13.  
    {
  14.  
    public partial class Form1 : Form
  15.  
    {
  16.  
    //WM_COPYDATA消息所要求的数据结构
  17.  
    public struct CopyDataStruct
  18.  
    {
  19.  
    public IntPtr dwData;
  20.  
    public int cbData;
  21.  
     
  22.  
    [MarshalAs(UnmanagedType.LPStr)]
  23.  
    public string lpData;
  24.  
    }
  25.  
     
  26.  
    private const int WM_COPYDATA = 0x004A;
  27.  
    //接收消息方法
  28.  
    protected override void WndProc(ref System.Windows.Forms.Message e)
  29.  
    {
  30.  
    if (e.Msg == WM_COPYDATA)
  31.  
    {
  32.  
    CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct));
  33.  
    textBox1.Text = cds.lpData.ToString(); //将文本信息显示到文本框
  34.  
    //MessageBox.Show(cds.lpData);
  35.  
    }
  36.  
    base.WndProc(ref e);
  37.  
    }
  38.  
     
  39.  
     
  40.  
    public Form1()
  41.  
    {
  42.  
    InitializeComponent();
  43.  
    }
  44.  
     
  45.  
    private void button1_Click_1(object sender, EventArgs e)
  46.  
    {
  47.  
     
  48.  
    }
  49.  
    }
  50.  
    }

6,原理:window提供了发送消息指令,0x004A,我们只需根据特定的函数和结构,发送消息,系统会自动找到另一个窗口名字的进程的窗口句柄,重写该窗口的接收消息函数,接收发送的消息。

对于不可控的事情,保持乐观; 对于可控的事情,保持谨慎
原文地址:https://www.cnblogs.com/baylor2019/p/11943763.html