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);
        }