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

2009年4月27日星期一

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

首先建立两个C#应用程序项目。


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


第二个项目包含一个Windows Form(Form1),Form1上有两个Button,分别用来测试第一个应用程序中ButtonClick事件和修改第一个应用程序中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”。


0 评论:

发表评论