如题,传英文字符都没有问题,但传中文就出错;
下面是定义:
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");
}
下面是定义:
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");
}
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");
StructLayout(LayoutKind.Sequential)
]
public struct COPYDATASTRUCT
{
public Int32 dwData;
public Int32 cbData;
[
MarshalAs(UnmanagedType.LPStr)
]
public String lpData;
}
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);
因为这个.Length是计算字符数, 而不是计算字节数. 用这个Length会导致你乱码.