首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 進程間通訊實戰:WM_COPYDATA 訊息傳遞資料完整範例

     編輯:關於C語言

為何選擇 WM_COPYDATA?

Windows 進程間通訊(IPC)常見方案包括:記憶體映射檔、共享記憶體 DLL、命名管道、Socket 等。WM_COPYDATA 以實作簡單、無需額外同步機制、適合傳遞中小型唯讀資料著稱,是 WinForms 應用快速實現 IPC 的首選。

核心機制

  • 訊息碼:0x004A (WM_COPYDATA)
  • 發送端:SendMessage(hwnd, WM_COPYDATA, wParam, lParam),同步阻塞直到接收端複製完成,保證資料安全。
  • 資料結構 COPYDATASTRUCT:
    • dwData:使用者自訂標識
    • cbData:資料位元組長度
    • lpData:資料指標

完整雙向通訊範例

1. 共用結構定義

[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT {
    public IntPtr dwData;
    public int cbData;
    [MarshalAs(UnmanagedType.LPStr)] public string lpData;
}

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));
        textBox1.Text = cds.lpData; // 顯示接收字串
        return;
    }
    base.WndProc(ref m);
}

3. 發送端:尋找視窗並發送


[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);

private void btnSend_Click(object sender, EventArgs e) {
    IntPtr targetHandle = FindWindow(null, "接收方視窗標題");
    if (targetHandle == IntPtr.Zero) return;

    COPYDATASTRUCT cds = new COPYDATASTRUCT();
    cds.dwData = IntPtr.Zero;
    cds.lpData = txtInput.Text; // 要發送的字串
    cds.cbData = Encoding.Default.GetByteCount(cds.lpData) + 1;

    SendMessage(targetHandle, WM_COPYDATA, this.Handle, ref cds);
}

關鍵注意事項

  • 中文編碼:cbData 需按位元組計算(Encoding.Default.GetByteCount),非字元數。
  • 視窗標題唯一性:FindWindow 依標題查找,建議雙方約定固定唯一標題或使用 `RegisterWindowMessage` 註冊唯一訊息碼。
  • 資料大小限制:單次傳輸建議控制在 64KB 以內,大數據請改用記憶體映射檔或命名管道。
  • 安全性:僅適用於同一用戶會話、同完整性等級的進程;跨權限需配合 `ChangeWindowMessageFilterEx`。

適用場景與替代方案

適合:單機雙進程輕量級資料同步、外掛與主程式通訊、簡單指令下發。
不適合:高頻大數據流、跨機器、需雙向即時互動場景——請改用 Named Pipe、gRPC、Message Queue 等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved