(转)使用C#在应用程序间发送消息

欢迎访问中文C#技术站! 返回首页返回本类>>使用C#在应用程序间发送消息
使用C#在应用程序间发送消息www.chinacs.net  2004-11-29  中文C#技术站
使用C#在应用程序间发送消息

作者:kongxx

首先建立两个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 );
 }


 
Windows 窗体设计器生成的代码

 
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 );
 }


 
Windows 窗体设计器生成的代码

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

 

posted on 2008-07-21 09:20  冷月孤峰  阅读(197)  评论(0)    收藏  举报