C#實(shí)現(xiàn)在應(yīng)用程序間發(fā)送消息的方法示例
本文實(shí)例講述了C#實(shí)現(xiàn)在應(yīng)用程序間發(fā)送消息的方法。分享給大家供大家參考,具體如下:
首先建立兩個C#應(yīng)用程序項(xiàng)目。
第一個項(xiàng)目包含一個Windows Form(Form1),在Form1上有一個Button和一個TextBox。
第二個項(xiàng)目包含一個Windows Form(Form1),在Form1上有兩個Button,分別用來測試第一個應(yīng)用程序中Button的Click事件和修改第一個應(yīng)用程序中TextBox的值。
第一個應(yīng)用程序中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 窗體設(shè)計(jì)器生成的代碼 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!"); } }
第二個應(yīng)用程序中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 窗體設(shè)計(jì)器生成的代碼 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中編譯運(yùn)行,也可以使用csc.exe編譯,如使用一下命令行:
F:>csc.exe Form1.cs F:>csc.exe TestForm1.cs
編譯后生成兩個.exe文件。
首先運(yùn)行第一個程序,顯示Form1窗體,然后運(yùn)行第二個程序,顯示TestForm1窗體。
在TestForm1窗體上點(diǎn)擊button1按鈕(向Form1窗體上的button1發(fā)送消息)此時顯示對話框提示“This is button1 click!”。
在TestForm1窗體上點(diǎn)擊button2按鈕(向Form1窗體上的textBox1發(fā)送消息)此時在Form1上的textBox1上顯示“測試aaa”。
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《WinForm控件用法總結(jié)》、《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)
本篇文章小編為大家介紹,Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)。需要的朋友參考下2013-04-04C# WinForm國際化實(shí)現(xiàn)的簡單方法
這篇文章主要介紹了C# WinForm國際化實(shí)現(xiàn)的簡單方法,有需要的朋友可以參考一下2014-01-01c#自定義Attribute獲取接口實(shí)現(xiàn)示例代碼
這篇文章主要給大家介紹了關(guān)于c#自定義Attribute獲取接口實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09C#實(shí)現(xiàn)數(shù)字轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)數(shù)字轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-04-04