本文实例讲述了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#程序设计有所帮助。