查看: 1915|回复: 0

[.NET源码] C#实现在应用程序间发送消息的方法示例

发表于 2018-2-11 10:30:26

本文实例讲述了C#实现在应用程序间发送消息的方法。分享给大家供大家参考,具体如下:

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

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

第二个项目包含一个Windows Form(Form1),在Form1上有两个Button,分别用来测试第一个应用程序中Button的Click事件和修改第一个应用程序中TextBox的值。

第一个应用程序中Form的代码如下:

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. public class Form1 : System.Windows.Forms.Form {
  7. private System.Windows.Forms.Button button1;
  8. private System.Windows.Forms.TextBox textBox1;
  9. private System.ComponentModel.Container components = null;
  10. [STAThread]
  11. static void Main() {
  12. Application.Run(new Form1());
  13. }
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. protected override void Dispose( bool disposing )
  19. {
  20. if( disposing )
  21. {
  22. if(components != null)
  23. {
  24. components.Dispose();
  25. }
  26. }
  27. base.Dispose( disposing );
  28. }
  29. #region Windows 窗体设计器生成的代码
  30. private void InitializeComponent()
  31. {
  32. this.button1 = new System.Windows.Forms.Button();
  33. this.textBox1 = new System.Windows.Forms.TextBox();
  34. this.SuspendLayout();
  35. //
  36. // button1
  37. //
  38. this.button1.Location = new System.Drawing.Point(32, 24);
  39. this.button1.Name = "button1";
  40. this.button1.TabIndex = 0;
  41. this.button1.Text = "button1";
  42. this.button1.Click += new System.EventHandler(this.button1_Click);
  43. //
  44. // textBox1
  45. //
  46. this.textBox1.Location = new System.Drawing.Point(32, 64);
  47. this.textBox1.Name = "textBox1";
  48. this.textBox1.TabIndex = 1;
  49. this.textBox1.Text = "textBox1";
  50. //
  51. // Form1
  52. //
  53. this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  54. this.ClientSize = new System.Drawing.Size(292, 266);
  55. this.Controls.Add(this.textBox1);
  56. this.Controls.Add(this.button1);
  57. this.Name = "Form1";
  58. this.Text = "Form1";
  59. this.ResumeLayout(false);
  60. }
  61. #endregion
  62. private void button1_Click(object sender, System.EventArgs e) {
  63. MessageBox.Show("This is button1 click!");
  64. }
  65. }
复制代码

第二个应用程序中Form的代码如下:

  1. using System;
  2. using System.Text;
  3. using System.Drawing;
  4. using System.Collections;
  5. using System.ComponentModel;
  6. using System.Windows.Forms;
  7. using System.Runtime.InteropServices;
  8. public class TestForm1 : System.Windows.Forms.Form {
  9. private System.Windows.Forms.Button button1;
  10. private System.Windows.Forms.Button button2;
  11. private System.ComponentModel.Container components = null;
  12. [STAThread]
  13. static void Main() {
  14. Application.Run(new TestForm1());
  15. }
  16. public TestForm1()
  17. {
  18. InitializeComponent();
  19. }
  20. protected override void Dispose( bool disposing )
  21. {
  22. if( disposing )
  23. {
  24. if(components != null)
  25. {
  26. components.Dispose();
  27. }
  28. }
  29. base.Dispose( disposing );
  30. }
  31. #region Windows 窗体设计器生成的代码
  32. private void InitializeComponent()
  33. {
  34. this.button1 = new System.Windows.Forms.Button();
  35. this.button2 = new System.Windows.Forms.Button();
  36. this.SuspendLayout();
  37. //
  38. // button1
  39. //
  40. this.button1.Location = new System.Drawing.Point(32, 24);
  41. this.button1.Name = "button1";
  42. this.button1.TabIndex = 0;
  43. this.button1.Text = "button1";
  44. this.button1.Click += new System.EventHandler(this.button1_Click);
  45. //
  46. // button2
  47. //
  48. this.button2.Location = new System.Drawing.Point(32, 64);
  49. this.button2.Name = "button2";
  50. this.button2.TabIndex = 0;
  51. this.button2.Text = "button2";
  52. this.button2.Click += new System.EventHandler(this.button2_Click);
  53. //
  54. // TestForm1
  55. //
  56. this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  57. this.ClientSize = new System.Drawing.Size(292, 266);
  58. this.Controls.Add(this.button1);
  59. this.Controls.Add(this.button2);
  60. this.Name = "TestForm1";
  61. this.Text = "TestForm1";
  62. this.ResumeLayout(false);
  63. }
  64. #endregion
  65. private void button1_Click(object sender, System.EventArgs e) {
  66. IntPtr hwnd_win ;
  67. IntPtr hwnd_button ;
  68. hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
  69. hwnd_button = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.BUTTON.app3","button1");
  70. const int BM_CLICK = 0x00F5;
  71. Message msg = Message.Create(hwnd_button ,BM_CLICK ,new IntPtr(0),new IntPtr(0));
  72. PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
  73. }
  74. private void button2_Click(object sender, System.EventArgs e) {
  75. const int WM_CHAR = 0x0102;
  76. IntPtr hwnd_win ;
  77. IntPtr hwnd_textbox ;
  78. hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
  79. hwnd_textbox = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.EDIT.app3","textBox1");
  80. string strtext = "测试aaa";
  81. UnicodeEncoding encode = new UnicodeEncoding();
  82. char[] chars = encode.GetChars(encode.GetBytes(strtext));
  83. Message msg ;
  84. foreach (char c in chars ) {
  85. msg = Message.Create(hwnd_textbox ,WM_CHAR ,new IntPtr(c),new IntPtr(0));
  86. PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
  87. }
  88. }
  89. [DllImport("user32.dll")]
  90. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  91. [DllImport("user32.dll")]
  92. public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);
  93. [DllImport("user32.dll",CharSet=CharSet.Unicode)]
  94. public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);
  95. }
复制代码

以上代码可以在VS.NET中编译运行,也可以使用csc.exe编译,如使用一下命令行:

  1. F:>csc.exe Form1.cs
  2. 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#程序设计有所帮助。

您可能感兴趣的文章:

  • C#Web应用程序入门经典学习笔记之一
  • C#Web应用程序入门经典学习笔记之二
  • C# 禁止应用程序多次启动的实例
  • c#取得控制台应用程序根目录
  • C# WinForm应用程序降低系统内存占用方法总结
  • C#记录消息到日志文件的方法
  • C#使用windows服务开启应用程序的方法
  • C#实现将应用程序设置为开机启动的方法
  • C#实现带消息数的App图标
  • C#向无窗口的进程发送消息
  • C#微信开发之接收 / 返回文本消息


回复

使用道具 举报