Windows 進程間通訊(IPC)常見方案包括:記憶體映射檔、共享記憶體 DLL、命名管道、Socket 等。WM_COPYDATA 以實作簡單、無需額外同步機制、適合傳遞中小型唯讀資料著稱,是 WinForms 應用快速實現 IPC 的首選。
0x004A (WM_COPYDATA)SendMessage(hwnd, WM_COPYDATA, wParam, lParam),同步阻塞直到接收端複製完成,保證資料安全。COPYDATASTRUCT:
dwData:使用者自訂標識cbData:資料位元組長度lpData:資料指標[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT {
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)] public string lpData;
}
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);
}
[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` 註冊唯一訊息碼。適合:單機雙進程輕量級資料同步、外掛與主程式通訊、簡單指令下發。
不適合:高頻大數據流、跨機器、需雙向即時互動場景——請改用 Named Pipe、gRPC、Message Queue 等。