用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”。