C#实现在应用程序间发送消息的方法示例

 更新时间:2017年06月23日 09:16:51   作者:kongxx  
这篇文章主要介绍了C#实现在应用程序间发送消息的方法,结合具体实例形式分析了C#实现项目之间信息发送、接收等交互操作相关技巧,需要的朋友可以参考下

本文实例讲述了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#相关内容感兴趣的读者可查看本站专题:《WinForm控件用法总结》、《C#窗体操作技巧汇总》、《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结

希望本文所述对大家C#程序设计有所帮助。

相关文章

  • Unity 从Resources中动态加载Sprite图片的操作

    Unity 从Resources中动态加载Sprite图片的操作

    这篇文章主要介绍了Unity 从Resources中动态加载Sprite图片的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • c#反射调用方法示例

    c#反射调用方法示例

    这篇文章主要介绍了c#反射调用方法示例,需要的朋友可以参考下
    2014-04-04
  • C#/.Net开发chatGPT、openAI的简单步骤

    C#/.Net开发chatGPT、openAI的简单步骤

    OpenAI处于科技行业下一件大事件的最前沿,具有初创公司史诗般的标志,下面这篇文章主要给大家介绍了关于C#/.Net开发chatGPT和openAI的相关资料,需要的朋友可以参考下
    2023-02-02
  • c# 连接access数据库config配置

    c# 连接access数据库config配置

    c# 连接access数据库config配置,需要的朋友可以参考一下
    2013-02-02
  • 基于反射解决类复制的实现方法

    基于反射解决类复制的实现方法

    本篇文章对反射解决类复制的实现方法进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C# String字符串案例详解

    C# String字符串案例详解

    这篇文章主要介绍了C# String字符串案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解C#中的依赖注入和IoC容器

    详解C#中的依赖注入和IoC容器

    这篇文章主要介绍了C#中的依赖注入和IoC容器的相关资料,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • 图文详解C#中的协变与逆变

    图文详解C#中的协变与逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型,这篇文章主要给大家介绍了关于C#中协变与逆变的相关资料,需要的朋友可以参考下
    2022-02-02
  • C#中使用强制类型实现字符串和ASCII码之间的转换

    C#中使用强制类型实现字符串和ASCII码之间的转换

    这篇文章主要介绍了C#中使用强制类型实现字符串和ASCII码之间的转换,本文还给出了另一种方法,需要的朋友可以参考下
    2014-08-08
  • WPF如何自定义TabControl控件样式示例详解

    WPF如何自定义TabControl控件样式示例详解

    这篇文章主要给大家介绍了关于WPF如何自定义TabControl控件样式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04

最新评论