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

这篇博客展示了如何使用C#在两个独立的应用程序之间进行消息传递。通过示例代码,解释了如何找到并操作另一个应用程序的控件,例如触发按钮点击事件和修改文本框内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值