public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { // Handle messages... switch (msg) { case MSG_DEF.WM_COPYDATA: { COPYDATASTRUCT param = Marshal.PtrToStructure <COPYDATASTRUCT>(lParam); // 不使用自定义结构体 // byte[] buffer = new byte[param.cbData]; // Marshal.Copy(param.lpData, buffer, 0, param.cbData); // string content = Encoding.Default.GetString(buffer); // 自定义结构体 LONGDATASTRUCT data = Marshal.PtrToStructure <LONGDATASTRUCT>(param.lpData); // TODO: 数据处理 #if DEBUG Debug.WriteLine($"Received: \n\tsender: {data.sender}\n\tcontent: {data.content}\n\ttag: {data.tag}"); #endif handled = true; break; } default: break; } return(IntPtr.Zero); }
public void SendMsg(string windowName) { IntPtr hWnd = WinApiHelper.FindWindow(null, windowName); if (hWnd == IntPtr.Zero) { return; } // WinApiHelper.SetWindowText(hWnd, "Hello"); // WinApiHelper.ShowWindow(hWnd, 5); // WinApiHelper.SetForegroundWindow(hWnd); // WinApiHelper.SendMessage(hWnd, 0x1081, 0, "msg"); LONGDATASTRUCT longData = new LONGDATASTRUCT() { sender = System.Windows.Application.Current.MainWindow.Title, content = "你好。", tag = "来自 C# WPF" }; // 将数据拷贝至非托管内存 IntPtr longDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(longData)); Marshal.StructureToPtr <LONGDATASTRUCT>(longData, longDataPtr, true); COPYDATASTRUCT copyData = new COPYDATASTRUCT() { dwData = IntPtr.Zero, cbData = Marshal.SizeOf(longData), lpData = longDataPtr, }; IntPtr cpDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(copyData)); Marshal.StructureToPtr(copyData, cpDataPtr, true); WinApiHelper.SendMessage(hWnd, MSG_DEF.WM_COPYDATA, IntPtr.Zero, cpDataPtr); // 释放掉相应的非托管内存数据 Marshal.FreeHGlobal(longDataPtr); Marshal.FreeHGlobal(cpDataPtr); }