使用C#在應用程式間傳送訊息

iDotNetSpace發表於2009-02-02
首先建立兩個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”。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-545025/,如需轉載,請註明出處,否則將追究法律責任。

相關文章