C#基于SendMessage;Api实现进程间通信;传输二进制数据
参考博文:
从C#下使用WM_COPYDATA传输数据说到Marshal的应用 - jiangyh - 博客园 (cnblogs.com)
使用Windows API实现两个进程间(含窗体)的通信_踏雪无痕大黄蜂的博客-CSDN博客
问题解决:
无法封送处理类型为“COPYDATASTRUCT”的字段“lpData”: 无效的托管/非托管类型组合(Int/UInt 必须与 SysInt 或 SysUInt 成对出现)。
注释掉COPYDATASTRUCT结构体中的[MarshalAs(UnmanagedType.LPStr)]:
//[MarshalAs(UnmanagedType.LPStr)]
SendMessage函数完全使用手册 - 多义科技 - 博客园 (cnblogs.com)
WM_COPYDATA消息 (Winuser.h) - Win32 apps | Microsoft Docs
WPF实战小技巧(三):使用SendMessage实现进程间通信(含示例代码)_Mars Coder的博客-CSDN博客_wpf的sendmessage
// 导出SendMessage函数
[DllImport("User32.dll",EntryPoint = "SendMessage")]
private static extern intSendMessage(IntPtr hWnd, int Msg, IntPtrwParam, ref COPYDATASTRUCTlParam);
自定义消息结构体
使用SendMessage进行进程间通信时,可以发送具有自定义结构体的消息,从而实现更多的通信功能,例如操纵程序的运行,自定义结构体的示例代码如下:
const int WM_COPYDATA= 0x004A; // 固定数值,不可更改
//消息标识
private const int WM_COPYDATA = 0x004A;
//消息数据类型(typeFlag以上二进制,typeFlag以下字符)
private const uint typeFlag = 0x8000;
/// <summary>
/// 重载CopyDataStruct
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
//
[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT lParam // second message parameter
);
//