zoukankan      html  css  js  c++  java
  • 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,我们只需根据特定的函数和结构,发送消息,系统会自动找到另一个窗口名字的进程的窗口句柄,重写该窗口的接收消息函数,接收发送的消息。

    对于不可控的事情,保持乐观; 对于可控的事情,保持谨慎
  • 相关阅读:
    软件工程课后作业3:如何返回一个整数数组中最大子数组的和
    软件工程课后作业2:四则运算题目扩展:可指定题目数量并且支持真分数运算
    软件工程课后作业1:三十道四则运算题目
    团队作业3返回整数数组中最大子数组的和(多个数组)
    求一个二维数组所有子数组和的最大值(郭少周,陈泽)
    郭少周和陈泽两人合作课堂练习和课下作业
    学生成绩查询系统个人NABCD
    返回一个整数组的最大子数组和
    个人项目3
    返回一个二维整数组中最大子数组的和
  • 原文地址:https://www.cnblogs.com/baylor2019/p/11943763.html
Copyright © 2011-2022 走看看