分类
使用 C# 在应用程序之间发送消息‖
| 第一个项目包含一个Wi | ndows Form(Form1),在Form1上 | 有一个Button和一个TextBox。 |
| 第二个项目包含一个Wi 个应用程序中Button的Clic | ndows Form(Form1),在Form1上 k事件和修改第一个应用程序中T | 有两个Button,分别用来测试第一 extBox的值。 |
| 第一个应用程序中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.Bu | tton button1; |
| private System.Windows.Forms.Te | xtBox textBox1; |
| private System.Comp | onentModel.Container compone | nts = 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 = ne | w System.Windows.Forms.TextB | ox(); |
| this.SuspendLayout(); |
| // |
| // button1 |
| // |
| this.button1.Locat | ion = new System.Drawing.Poi | nt(32, 24); |
| this.button1.Name = "button1"; |
| this.button1.TabIndex = 0; |
| this.button1.Text = "button1"; |
| this.button1.Click += new Syst | em.EventHandler(this.button1_Click); |
| // |
| // textBox1 |
| // |
| this.textBox1.Location = new S | ystem.Drawing.Point(32, 64); |
| this.textBox1.Name = "textBox1"; |
| this.textBox1.TabIndex = 1; |
| this.textBox1.Text = "textBox1"; |
| // |
| // Form1 |
| // |
| this.AutoScaleBase | Size = new System.Drawing.Si | ze(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(obje | ct sender, System.EventArgs e) { |
| MessageBox.Show("T | his 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 TestFor | m1 : System.Windows.Forms.Fo | rm { |
| private System.Windows.Forms.Bu | tton button1; |
| private System.Wind | ows.Forms.Button button2; |
| private System.ComponentModel.C | ontainer 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.Wind | ows.Forms.Button(); |
| this.SuspendLayout(); |
| // |
| // button1 |
| // |
| this.button1.Locat | ion = new System.Drawing.Poi | nt(32, 24); |
| this.button1.Name = "button1"; |
| this.button1.TabIndex = 0; |
| this.button1.Text = "button1"; |
| this.button1.Click += new Syst | em.EventHandler(this.button1_Click); |
| // |
| // button2 |
| // |
| this.button2.Location = new Sy | stem.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.AutoScaleBase | Size = new System.Drawing.Si | ze(6, 14); |
| this.ClientSize = new System.D | rawing.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(obje | ct sender, System.EventArgs e) { |
| IntPtr hwnd_win ; |
| IntPtr hwnd_button ; |
| hwnd_win = FindWin | dow("WindowsForms10.Window.8 | .app3","Form1"); |
| hwnd_button = Find rms10.BUTTON.app3","butt | WindowEx(hwnd_win ,new IntPt on1"); | r(0) ,"WindowsFo |
| const int BM_CLICK = 0x00F5; |
| Message msg = Mess IntPtr(0)); | age.Create(hwnd_button ,BM_C | LICK ,new IntPtr(0),new |
| PostMessage(msg.HW | nd ,msg.Msg ,msg.WParam ,msg | .LParam); |
| } |
| private void button | 2_Click(object sender, Syste | m.EventArgs e) { |
| const int WM_CHAR = 0x0102; |
| IntPtr hwnd_win ; |
| IntPtr hwnd_textbox ; |
| hwnd_win = FindWindow("Windows | Forms10.Window.8.app3","Form1"); |
| hwnd_textbox = Fin orms10.EDIT.app3","textB | dWindowEx(hwnd_win ,new IntP ox1"); | tr(0) ,"WindowsF |
| string strtext = "测试aaa"; |
| UnicodeEncoding en | code = new UnicodeEncoding() | ; |
| char[] chars = encode.GetChars | (encode.GetBytes(strtext)); |
| Message msg ; |
| foreach (char c in chars ) { |
| msg = Message.Cre | ate(hwnd_textbox ,WM_CHAR ,n | ew IntPtr(c),new IntPtr(0)); |
| PostMessage(msg.HWnd ,msg.Msg | ,msg.WParam ,msg.LParam); |
| } |
| } |
| [DllImport("user32.dll")] |
| public static exter lpWindowName); | n IntPtr FindWindow(string l | pClassName, string |
| [DllImport("user32.dll")] |
| public static exter hwndChildAfter,string lp | n IntPtr FindWindowEx(IntPtr szClass,string lpszWindow); | hwndParent,IntPtr |
| [DllImport("user32.dll",CharSet | =CharSet.Unicode)] |
| public static exter wParam,IntPtr lParam); | n IntPtr PostMessage(IntPtr | hwnd,int wMsg,IntPtr |
| } |
| 以上代码可以在VS.NET中编译运行, | 也可以使用csc.exe编译,如使用一下命令行: |
| F:>csc.exe Form1.cs |
| F:>csc.exe TestForm1.cs |
| 编译后生成两个.exe文件。 |
| 首先运行第一个程序,显示Form1窗 | 体,然后运行第二个程序,显示TestForm1窗体。 |
| 在TestForm1窗体上点 话框提示“This is button | 击button1按钮(向Form1窗体上 1 click!”。 | 的button1发送消息)此时显示对 |
| 在TestForm1窗体上点击button2按钮 上的textBox1上显示“测试aaa”。 | (向Form1窗体上的textBox1发送消息)此时在Form1 |