赞
踩
这部分分为3部分。
一、2个exe程序之间通信,第一个程序发送消息,第二个程序实时接收消息。
二、2个exe程序之间通信,第一个程序发送命令执行第二窗口中的按钮事件。
三、2个exe程序之间通信,第一个程序发送消息到第二个程序中的某一个控件中。
一,2个exe程序之间通信,第一个程序发送消息,第二个程序实时接收消息。
1.建立第一个程序,界面如下
2.代码
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace Demo
- {
- public partial class Form1 : Form
- {
- [DllImport("User32.dll", EntryPoint = "SendMessage")]
- private static extern int SendMessage(
- int hWnd,
- int Msg,
- int wParam,
- ref COPYDATASTRUCT lParam
- );
- [DllImport("User32.dll", EntryPoint = "FindWindow")]
- private static extern int FindWindow(string lpClassName, string
- lpWindowName);
-
-
-
- public Form1()
- {
- InitializeComponent();
- }
-
- private void button2_Click(object sender, EventArgs e)
- {
-
- int WINDOW_HANDLER = FindWindow(null, "Form1");//获取Form1的句柄,一定是第二个程序的名字
-
- byte[] sarr = System.Text.Encoding.Default.GetBytes(textBox1.Text);
- int len = sarr.Length;
-
- COPYDATASTRUCT cds;
- cds.dwData = (IntPtr)100;
- cds.lpData = textBox1.Text;
- cds.cbData = len + 1;
- SendMessage(WINDOW_HANDLER, 0x004A, 0, ref cds);
-
- }
- public struct COPYDATASTRUCT
- {
- public IntPtr dwData;
- public int cbData;
- [MarshalAs(UnmanagedType.LPStr)]
- public string lpData;
- }
- }
- }

3.建立第二个程序
4.代码
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace WindowsFormsApp1
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- protected override void DefWndProc(ref System.Windows.Forms.Message m)
- {
- switch (m.Msg)
- {
- case 0x004A://处理消息
- COPYDATASTRUCT mystr = new COPYDATASTRUCT();
- Type mytype = mystr.GetType();
- mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
- this.richTextBox1.Text = mystr.lpData;
- break;
- default:
- base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
- break;
- }
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct COPYDATASTRUCT
- {
- public IntPtr dwData;
- public int cbData;
- [MarshalAs(UnmanagedType.LPStr)]
- public string lpData;
- }
-
- }
- }

注意:Form1一定是第二个程序的名字
5.,运行2个exe,点击发送按钮,效果
二、2个exe程序之间通信,第一个程序发送命令执行第二窗口中的按钮事件。
1.建立一个程序,第一个界面
2.代码
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace Demo
- {
- public partial class Form1 : Form
- {
- [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);
-
- public Form1()
- {
- InitializeComponent();
- }
-
- private void button2_Click(object sender, EventArgs e)
- {
-
- IntPtr hwnd_win;
- IntPtr hwnd_button;
-
- hwnd_win = FindWindow(null, "Form1");//得到Form1的句柄
- hwnd_button = FindWindowEx(hwnd_win, new IntPtr(0), null, "按钮");//得到Form1中按钮的句柄
- 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);
-
- }
-
- }
- }

3.第二个界面
4.代码
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace WindowsFormsApp1
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
-
- private void button1_Click(object sender, EventArgs e)
- {
- MessageBox.Show("你好");
- }
- }
- }

5.,运行2分exe,点击发送按钮,效果
三、2个exe程序之间通信,第一个程序发送消息到第二个程序中的某一个控件中。
1.第一个程序界面
2.代码
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace Demo
- {
- public partial class Form1 : Form
- {
- [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);
-
- public Form1()
- {
- InitializeComponent();
- }
-
- private void button2_Click(object sender, EventArgs e)
- {
- const int WM_CHAR = 0x0102;
- IntPtr hwnd_win;
- IntPtr hwnd_textbox;
-
- hwnd_win = FindWindow(null, "Form1");
- hwnd_textbox = FindWindowEx(hwnd_win, new IntPtr(0), null, "消息");
-
- UnicodeEncoding encode = new UnicodeEncoding();
- char[] chars = encode.GetChars(encode.GetBytes(textBox1.Text));
- 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);
- }
- }
-
- }
- }

3.第二个程序只需要拖一个接收消息的textBox1,里面写上消息二字,因为第一个程序要获取它
4.运行2个exe,点击发送按钮,效果
这里获取的都是句柄,调用的方法都是Windows api函数。需要了解Windows API的可以看关于《精通Windows.API-函数、接口、编程实例》 这本书
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。