如题,传英文字符都没有问题,但传中文就出错; 
  下面是定义
            public static extern int SendMessage( 
            int hWnd, 
            uint Msg, 
            int wParam, 
            int lParam 
            ); 
        [DllImport("User32.dll ")]         public static extern int SendMessage(         int hWnd,   //   handle   to   destination   window            uint Msg,   //   message            int wParam,   //   first   message   parameter            ref   COPYDATASTRUCT lParam   //   second   message   parameter   sss         ); 
        public struct COPYDATASTRUCT 
        {             public IntPtr dwData;//用户定义数据             public int cbData;//长度             [MarshalAs(UnmanagedType.LPStr)] 
            public string lpData;//数据         }  
     接收代码: 
            if (m.Msg == msg.WM_COPYDATA) 
            {                 COPYDATASTRUCT mystr = new COPYDATASTRUCT();                 Type mytype = mystr.GetType();                 mystr = (COPYDATASTRUCT)m.GetLParam(mytype); 
                string msg1 = mystr.lpData; 
          richTextBox1.AppendText(msg1 + "\n"); 
       } 

解决方案 »

  1.   

    LPSTR是对应的char*, 而中文是双字节, 你可以尝试用LPTSTR, Unicode它对应的是WCHAR*
      

  2.   

    发送代码:string value = "->你要发送的内容";
    byte[] buffer = Encoding.UTF8.GetBytes(value);
    int length = buffer.Length;
    COPYDATASTRUCT data = new COPYDATASTRUCT();
    data.dwData = new IntPtr(0x0001);
    data.cbData = length + 1; //\x00
    data.lpData = value;
    Thread.Sleep(100); //可选..
    SendMessage(IntPtr.Zero/*目标句柄*/, WM_COPYDATA, (int)this.Handle, ref data);接收代码:COPYDATASTRUCT data = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
    string msg = mystr.lpData;
    this.richTextBox1.AppendText(msg + "\n");
      

  3.   

    修正: string msg = data.lpData;
      

  4.   

    先把 COPYDATASTRUCT 修改如下, 然后相应改动一下试试..        [
            StructLayout(LayoutKind.Sequential)
            ]
            public struct COPYDATASTRUCT
            {
                public Int32 dwData;
                public Int32 cbData;
                [
                MarshalAs(UnmanagedType.LPStr)
                ]
                public String lpData;
            }
      

  5.   

    我刚才看了一下, 
    typedef struct tagCOPYDATASTRUCT {
        ULONG_PTR dwData;
        DWORD cbData;
        PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;
    这是它的原型定义, 而你将PVOID改成了String, 这个做法不妥, 保持C++的原型, 声明为IntPtr.
            public struct COPYDATASTRUCT
            {
                public IntPtr dwData;              public uint cbData;             public IntPtr lpData; //将PVOID声明为IntPtr, 保持指针一致性.
            }在你的发送方
    String value="abc123测试";
    ... 
    //明确使用Unicode
    data.cbData = Encoding.Unicode.GetBytes(value).Length+1;
    //将字符串封送为指向Unicode字符串的指针.
    data.lpData = Marshal.StringToHGlobalUni(value); 
    接收方
    //获取指针指向的Unicode字符串.
    string msg1 = Marshal.PtrToStringUni(mystr.lpData);
      

  6.   

    当然, 如果你这里只是用于传递字符串, 那声明为String类型也可以.注意.Net的所有字符串都是Unicode的, 你计算长度的时候, 不能直接data.cbData = value.Length+1; 
    因为这个.Length是计算字符数, 而不是计算字节数. 用这个Length会导致你乱码.