这部分分为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-函数、接口、编程实例》 这本书