发送时只能以结构体形式发送,类的话会提示“指定结构必须能直接复制到本机结构中,或是具有布局信息 ”的错误提示
以下两种结构体示例都可以被发送
public struct A{public A(int a){name = "heow";array = new double[3] { 1, 2, 5.6 };}string name;//{ get; set; }double[] array ;//{ get; set; }}/// <summary>/// 定义结构体/// </summary>public struct COPYDATASTRUCT{public IntPtr dwData; //可以是任意值public int cbData; //指定lpData内存区域的字节数[MarshalAs(UnmanagedType.LPStr)]public string lpData; //发送给目录窗口所在进程的数据}
发送方:
[DllImport("User32.dll", EntryPoint = "SendMessage")]private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);[DllImport("User32.dll", EntryPoint = "FindWindow")]private static extern int FindWindow(string lpClassName, string lpWindowName);const int WM_COPYDATA = 0x004A;//必须是这个数值,不能更改private void btnSend_Click(object sender, EventArgs e){int hWnd = FindWindow(null, @"消息接受者");if (hWnd == 0){MessageBox.Show("未找到消息接受者!");}else{string sendString = "测试发送数据";byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);int len = sarr.Length;COPYDATASTRUCT cds;cds.dwData = (IntPtr)0 ;cds.cbData = len + 1;cds.lpData = sendString;SendMessage(hWnd, WM_COPYDATA, 0, ref cds);}}
接受方:
private static int WMA_InterPro = 0x004A;protected override void DefWndProc(ref Message m){if (m.Msg == WMA_InterPro){COPYDATASTRUCT cds = new COPYDATASTRUCT();Type t = cds.GetType();cds = (COPYDATASTRUCT)m.GetLParam(t);string receiveInfo=cds.lpData; }else{base.DefWndProc(ref m);}}
PS:
C# 使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)