C# Winform -----通过copydata实现两个Form进程间通信
winform 在两个form窗口间实现进程通信
1.首先在建立两个项目 一个form作为发送方 name:Sender ,一个form作为接受方 name:Receiver
## 接收方
1.布局
TextBox控件 name:textBox1
发送按钮控件 name:Send_But
2.代码
public partial class Sender : Form
{
//发送消息
public Sender()
{
InitializeComponent();
}
//消息标识
//WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。
public const int WM_COPYDATA = 0x004A;
//COPYDATASTRUCT 结构
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
//系统SendMessage方法 SendMessage为阻塞方法
[DllImport("User32.dll",EntryPoint = "SendMessage")]
public static extern int SendMessage(//系统级的函数
int hwnd, // handle to destination window
int msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT IParam);
[DllImport("User32.dll",EntryPoint = "FindWindow")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
//自己封装的方法
public int Send_message(int handle,string message) {
byte[] arr = System.Text.Encoding.Default.GetBytes(message);
int len = arr.Length;
COPYDATASTRUCT cdata;//打开结构体
cdata.dwData = (IntPtr)100;//对结构体赋值
cdata.lpData = message;//对结构体赋值
cdata.cData = len + 1;//对结构体赋值
return SendMessage(handle, WM_COPYDATA, 0, ref cdata);//调用SendMessage
}
private void Send_But_Click(object sender, EventArgs e)
{
int Form_HANDLE = FindWindow(null, "Receiver");//拿到接受方窗体的句柄
if (Form_HANDLE != 0)
{
int ret = Send_message(Form_HANDLE, this.textBox1.Text);
}
}
}
接收方
接收方使用label控件作为发送方数据的显示控件 name:label1
代码
public partial class Receiver : Form
{
public Receiver()
{
InitializeComponent();
}
//COPYDATASTRUCT结构
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
public const int WM_COPYDATA = 0x004A;
//捕获消息
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
//处理消息
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
string content= mystr.lpData;
label1.Text = content;
break;
default:
break;
}
base.WndProc(ref m);
}
}
效果
总结:
可将两个共有部分提取 分装成一个帮助类方法