使用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”。
首先建立兩個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