本文实例讲述了C#实现在应用程序间发送消息的方法。分享给大家供大家参考,具体如下:
首先建立两个C#应用程序项目。
第一个项目包含一个Windows Form(Form1),在Form1上有一个Button和一个TextBox。
第二个项目包含一个Windows Form(Form1),在Form1上有两个Button,分别用来测试第一个应用程序中Button的Click事件和修改第一个应用程序中TextBox的值。
第一个应用程序中Form的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
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的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
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编译,如使用一下命令行:
1
2
|
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#程序设计有所帮助。