代码实现
1. 发送端实现
定义常量和结构体
const int WM_COPYDATA = 0x004a;
/// <summary>
/// 使用COPYDATASTRUCT来传递字符串
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
导入Windows API函数
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private extern static int SendMessage(
int hWnd,//handle to destination window
int Msg,//message
int wParam,//first message parameter
ref COPYDATASTRUCT lParam//sender message parameter
);
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
实现消息发送方法
public int Send_message(int handle, string message)
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(message);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = message;
cds.cbData = len + 1;
return SendMessage(handle, WM_COPYDATA, 0, ref cds);
}
发送消息
private void button1_Click(object sender, EventArgs e)
{
IntPtr handle = FindWindow(null, "Form_Receiver");
if (handle != IntPtr.Zero)
{
Send_message(handle.ToInt32(), textBox1.Text);
}
}
2. 接收端实现
重写WndProc方法
const int WM_COPYDATA = 0x004a;
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_COPYDATA)
{
COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
label1.Text = cds.lpData;
}
base.WndProc(ref m);
}