好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#实现在应用程序间发送消息的方法示例

本文实例讲述了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);

}

以上代码可以在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 ]。

希望本文所述对大家C#程序设计有所帮助。

dy("nrwz");

查看更多关于C#实现在应用程序间发送消息的方法示例的详细内容...

  阅读:37次