Winform窗体间跨进程通讯

代码实现

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);    
}
posted @ 2026-04-15 17:16  (*_^)?  阅读(13)  评论(0)    收藏  举报