zoukankan      html  css  js  c++  java
  • 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#程序设计有所帮助。

    (编辑:雷林鹏 来源:网络)

  • 相关阅读:
    gdb调试的基本使用
    重构改善代码--代码的坏味道
    17级单片机期中测试题目
    左右固定,中间自适应的三栏式布局五种写法
    存一些可能会用得到的vue的UI框架
    vue父子组件传值
    [Vue warn]: Missing required prop: "title"
    js中的值类型和引用类型的区别
    vue+node+mongoDB 火车票H5(四)---完成静态页面
    vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
  • 原文地址:https://www.cnblogs.com/pengpeng1208/p/9272396.html
Copyright © 2011-2022 走看看