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

原创 2004年08月06日 10:47:00

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

作者:kongxx

首先建立两个C#应用程序项目。

第一个项目包含一个Windows Form(Form1),Form1上有一个Button和一个TextBox

第二个项目包含一个Windows Form(Form1),Form1上有两个Button,分别用来测试第一个应用程序中ButtonClick事件和修改第一个应用程序中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#设计在局域网发送短信的程序

由于在单位使用到发手机短信息的地方有很多,可能是从网页、可能是OUTLOOK中的窗体、也可能是某台非Windows操作系统的主机的某个系统,所以经过思考探讨,觉得最好的解决方案是采用Windows的“...
  • mengyao
  • mengyao
  • 2006年11月11日 09:11
  • 6525

关于C#中实现两个应用程序消息通讯的问题

注意这里发送消息的函数:public static void SendMessage(string destProcessName, int msgID, string strMsg)只能发送一个ms...
  • wantsfly
  • wantsfly
  • 2006年04月24日 08:01
  • 3792

c实现非常简单的局域网聊天程序

毕业两年,学的东西都忘得差不多了。公司加班无聊,重温了一下UDP。一个局域网聊天程序。有诸多漏洞,练手为主。附上代码 // Sock.cpp : Defines the entry point fo...
  • rtwangdaobin123
  • rtwangdaobin123
  • 2012年06月08日 22:39
  • 484

一个java局域网聊天的程序

一个java局域网聊天的程序 有服务器端 和客户端两个界面,运行需要加上自己的ip地址,端口可以随意,但是客户端端口,和服务器端口要一样,然后就可以几个人一块聊天了 简单贴几个代码吧   Cli...
  • zhupengqq
  • zhupengqq
  • 2017年11月02日 21:00
  • 366

使用sendMessage向其他程序发送消息

_______________________________________百度百科__________________________________________函数功能该函数将指定的消息发送...
  • Mr_eee
  • Mr_eee
  • 2013年09月17日 12:54
  • 764

C#给其他程序发消息

帮人忙调试个C#给其他程序发消息的程序,搞定后相关关键点如下: 1、相关声明函数,SendMessage可定义两种格式。[DllImport("User32.DLL", CharSet = CharS...
  • feiwei
  • feiwei
  • 2010年05月17日 16:54
  • 2037

socket多人聊天程序C语言版(二)

1V1实现了,1V多也就容易了。不过相对于1V1的程序,我经过大改,采用链表来动态管理。这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了。用C语言写这个还是挺费时间的,因为什么...
  • qq_18297675
  • qq_18297675
  • 2016年10月15日 22:38
  • 5153

局域网聊天室源代码

VC++写的局域网聊天室,本程序既可以当做服务端,也可以当作客户端。当进入界面后,角色选择服务端,要先开启一个服务端,服务端的作用是接收到每个客户端发来的信息,然后发送给所有的客户端。  再运行程序,...
  • u012187684
  • u012187684
  • 2014年10月17日 09:58
  • 611

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

摘要:说来说去,还是觉得API的功能是最强大的,但是.NET FCL,MFC等对API的封装之后也使得程序的开发变得更加容易。本模块的主要原理还是使用API,查找指定类型,窗口文本的窗口对象,获取该对...
  • calm_agan
  • calm_agan
  • 2006年01月14日 20:25
  • 2550

c# 使用SendMessage向另一进程发送WM_COPYDATA消息通信

发送方: using System; using System.Collections.Generic; using System.ComponentModel; using System.D...
  • lcawen
  • lcawen
  • 2014年02月26日 13:31
  • 2268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C#在应用程序间发送消息
举报原因:
原因补充:

(最多只允许输入30个字)