• 使用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”。

  • 相关阅读:
    typescript基础语法--变量/函数/指令/类
    java获取post请求头部字符串
    spring MVC 3.2中@ResponseBody(Post接口)返回乱码的完美解决方案
    java+js正则表达式获取URL(带端口)域名
    jquery的ajax提交时加载处理方法
    js截取+全部替换+字符串
    Filter过滤器除去部分URL链接
    Eclipse常用快捷键
    CAS+Tomcat SSL第三方数据证书导入(jks)
    CAS客户端和服务器配置https证书
  • 原文地址:https://www.cnblogs.com/tuyile006/p/490131.html
Copyright © 2020-2023  润新知