用c#在应用程式间发送消息

来源:互联网 发布:汽车钣金要学多久知乎 编辑:程序博客网 时间:2024/06/06 19:55
用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”。