科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用C#在应用程序间发送消息

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

第一个项目包含一个Windows Form(Form1),在Form1上有一个Button和一个TextBox。

作者:online    来源:soft6 2008年5月16日

关键字: 消息 发送 C# Windows

  • 评论
  • 分享微博
  • 分享邮件
首先建立两个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);
  }

  以上代码可以在VS.NET中编译运行,也可以使用csc.exe编译,如使用一下命令行:

  F:>csc.exe Form1.cs
  F:>csc.exe TestForm1.cs

  编译后生成两个.exe文件。

  首先运行第一个程序,显示Form1窗体,然后运行第二个程序,显示TestForm1窗体。

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

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章