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

);

//

posted @ 2022-06-23 13:43  默默依然  阅读(437)  评论(0编辑  收藏  举报