当前位置: 首页 > news >正文

使用C#在应用程序间发送消息

首先建立两个C#应用程序项目。
  第一个项目包含一个Windows Form(Form1),在Form1上有一个Button和一个TextBox。

 

  第二个项目包含一个Windows Form(Form1),在Form1上有两个Button,分别用来测试第一个应用程序中Button的Click事件和修改第一个应用程序中TextBox的值。

  第一个应用程序中Form的代码如下:

 

 


  using System;
  using System.Drawing;
  using System.Collections;
  using System.ComponentModel;
  using System.Windows.Forms;

  public class Form1 : System.Windows.Forms.Form {
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.TextBox textBox1;

  private System.ComponentModel.Container components = null;

  [STAThread]
  static void Main() {
  Application.Run(new Form1());
  }

  public Form1()
  {
  InitializeComponent();
  }
  protected override void Dispose( bool disposing )
  {
  if( disposing )
  {
  if(components != null)
  {
  components.Dispose();
  }
  }
  base.Dispose( disposing );
  }

  #region Windows 窗体设计器生成的代码
  private void InitializeComponent()
  {
  this.button1 = new System.Windows.Forms.Button();
  this.textBox1 = new System.Windows.Forms.TextBox();
  this.SuspendLayout();
  //

 

  // button1
  //
  this.button1.Location = new System.Drawing.Point(32, 24);
  this.button1.Name = "button1";
  this.button1.TabIndex = 0;
  this.button1.Text = "button1";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  //
  // textBox1
  //
  this.textBox1.Location = new System.Drawing.Point(32, 64);
  this.textBox1.Name = "textBox1";
  this.textBox1.TabIndex = 1;
  this.textBox1.Text = "textBox1";
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(292, 266);
  this.Controls.Add(this.textBox1);
  this.Controls.Add(this.button1);
  this.Name = "Form1";
  this.Text = "Form1";
  this.ResumeLayout(false);

  }
  #endregion

  private void button1_Click(object sender, System.EventArgs e) {
  MessageBox.Show("This is button1 click!");
  }
  }

 

  第二个应用程序中Form的代码如下:


  using System;
  using System.Text;
  using System.Drawing;
  using System.Collections;
  using System.ComponentModel;
  using System.Windows.Forms;
  using System.Runtime.InteropServices;

  public class TestForm1 : System.Windows.Forms.Form {
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.Button button2;

  private System.ComponentModel.Container components = null;

 

 


  [STAThread]
  static void Main() {
  Application.Run(new TestForm1());
  }

  public TestForm1()
  {
  InitializeComponent();
  }
  protected override void Dispose( bool disposing )
  {
  if( disposing )
  {
  if(components != null)
  {
  components.Dispose();
  }
  }
  base.Dispose( disposing );
  }

  #region Windows 窗体设计器生成的代码
  private void InitializeComponent()
  {
  this.button1 = new System.Windows.Forms.Button();
  this.button2 = new System.Windows.Forms.Button();
  this.SuspendLayout();
  //
  // button1
  //
  this.button1.Location = new System.Drawing.Point(32, 24);
  this.button1.Name = "button1";
  this.button1.TabIndex = 0;
  this.button1.Text = "button1";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  //
  // button2
  //
  this.button2.Location = new System.Drawing.Point(32, 64);
  this.button2.Name = "button2";
  this.button2.TabIndex = 0;
  this.button2.Text = "button2";
  this.button2.Click += new System.EventHandler(this.button2_Click);
  //
  // TestForm1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(292, 266);

 


  this.Controls.Add(this.button1);
  this.Controls.Add(this.button2);
  this.Name = "TestForm1";
  this.Text = "TestForm1";
  this.ResumeLayout(false);

  }
  #endregion

  private void button1_Click(object sender, System.EventArgs e) {
  IntPtr hwnd_win ;
  IntPtr hwnd_button ;

  hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
  hwnd_button = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.BUTTON.app3","button1");

  const int BM_CLICK = 0x00F5;
  Message msg = Message.Create(hwnd_button ,BM_CLICK ,new IntPtr(0),new IntPtr(0));
  PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
  }
  private void button2_Click(object sender, System.EventArgs e) {
  const int WM_CHAR = 0x0102;
  IntPtr hwnd_win ;
  IntPtr hwnd_textbox ;

  hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
  hwnd_textbox = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.EDIT.app3","textBox1");
  
  string strtext = "测试aaa";
  UnicodeEncoding encode = new UnicodeEncoding();
  char[] chars = encode.GetChars(encode.GetBytes(strtext));
  Message msg ;
  foreach (char c in chars ) {
  msg = Message.Create(hwnd_textbox ,WM_CHAR ,new IntPtr(c),new IntPtr(0));
  PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
  }
  }

  [DllImport("user32.dll")]
  public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  
  [DllImport("user32.dll")]
  public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);

  [DllImport("user32.dll",CharSet=CharSet.Unicode)]
  public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);
  }
首先运行第一个程序,显示Form1窗体,然后运行第二个程序,显示TestForm1窗体。

  在TestForm1窗体上点击button1按钮(向Form1窗体上的button1发送消息)此时显示对话框提示“This is button1 click!”。

  在TestForm1窗体上点击button2按钮(向Form1窗体上的textBox1发送消息)此时在Form1上的textBox1上显示“测试aaa”。

相关文章:

  • iis 5.0 不能运行 asp.net 的 原因
  • 手把手教你"设"内网"变"外网"
  • C#结合串口通信类实现串口通信源代码(原创)
  • SOA 与 世界 3.0
  • Ip Messenger
  • windows还能抗住病毒吗?ubuntu唯一的遗憾是不能用网上银行
  • VB里面操作Excel(居然比C#强)
  • Google Talk最新版 支持语音邮件
  • CakePHP中文手册【翻译】-前言
  • 核心(Core) Javascript 学习手记
  • outlook 重复收发信
  • C#中的委托
  • DataGrid中删除最后一页的最后一条数据时CurrentPageIndex的问题
  • 显示隐藏文件
  • ASP对数据库的访问
  • ES6指北【2】—— 箭头函数
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Cumulo 的 ClojureScript 模块已经成型
  • Druid 在有赞的实践
  • IndexedDB
  • JavaScript设计模式之工厂模式
  • JS笔记四:作用域、变量(函数)提升
  • JS题目及答案整理
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Node项目之评分系统(二)- 数据库设计
  • 给Prometheus造假数据的方法
  • 经典排序算法及其 Java 实现
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 入门级的git使用指北
  • 王永庆:技术创新改变教育未来
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 责任链模式的两种实现
  • 智能合约Solidity教程-事件和日志(一)
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​Python 3 新特性:类型注解
  • #{}和${}的区别是什么 -- java面试
  • $ git push -u origin master 推送到远程库出错
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (ZT)出版业改革:该死的死,该生的生
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三)mysql_MYSQL(三)
  • (一)Thymeleaf用法——Thymeleaf简介
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .md即markdown文件的基本常用编写语法
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net多线程总结
  • .NET开源项目介绍及资源推荐:数据持久层
  • @DateTimeFormat 和 @JsonFormat 注解详解