C# 如何在windowsmessages上发送俄语和阿拉伯语字符?
我有两个c#应用程序通过windows消息进行对话 App1:向App2发送消息C# 如何在windowsmessages上发送俄语和阿拉伯语字符?,c#,C#,我有两个c#应用程序通过windows消息进行对话 App1:向App2发送消息 string msg=UserName+","+UserAge; byte[] sarr =System.Text.Encoding.Default.GetBytes(msg);// int len = sarr.Length; COPYDATASTRUCT cds; cds.dwData = (IntPtr)100; cds.lpData = msg; cds.cbData = len + 1; r
string msg=UserName+","+UserAge;
byte[] sarr =System.Text.Encoding.Default.GetBytes(msg);//
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = msg;
cds.cbData = len + 1;
result = SendMessage(hWnd, WM_COPYDATA, wParam, ref cds);
App2:从App1接收消息
COPYDATASTRUCT sentPara = new COPYDATASTRUCT();
Type mytype = sentPara.GetType();
sentPara = (COPYDATASTRUCT)message.GetLParam(mytype);
string[] parameters = sentPara.lpData.Split(',');
问题:
用户名是俄语的,当我在App2中收到它时,我得到了问号“???????”,我认为这是字节数组的编码,但我不知道如何解决它,我会在第二个代码中添加一行:
COPYDATASTRUCT sentPara = new COPYDATASTRUCT();
Type mytype = sentPara.GetType();
sentPara = (COPYDATASTRUCT)message.GetLParam(mytype);
var parametersDecoded = System.Text.Encoding.Default.GetString(sentPara.lpData);
string[] parameters = parametersDecoded.Split(',');
我将在第二个代码中添加一行:
COPYDATASTRUCT sentPara = new COPYDATASTRUCT();
Type mytype = sentPara.GetType();
sentPara = (COPYDATASTRUCT)message.GetLParam(mytype);
var parametersDecoded = System.Text.Encoding.Default.GetString(sentPara.lpData);
string[] parameters = parametersDecoded.Split(',');
您的两个应用程序是否作为两个独立的进程运行 如果是这样,则不能直接发送
string
,因为它将包含一些在另一个进程的地址空间中无效的内部指针。您不知道STRING类包含什么-它是隐藏的。因此,它可能包含它们,而不是“肯定包含”
(尽管在C#/.Net中它肯定包含)
您已经开始得很好了:您需要将该字符串的内容打包到一个原始字节数组中,自己保证它只包含数据而不包含指针,然后将原始数组发送到第二个进程
问题的核心是COPYDATA
结构的p/Invoke定义错误。lpVoid
不应为string
类型,而应为byte[]
或IntPtr
类型。一旦将其类型更改为byte[]
,编译器将立即显示“=msg”和“.Split”无效
请注意,您当前的发送代码只包含一个错误:您提供的“数据长度”是数组的长度(正确),但它传递的是“msg”,而不是数组“sarr”。修复lpVoid类型后,只需将字段设置为sarr
然后,在接收端,您需要获取COPYDATA,从中获取一个
lpVoid
,将其用作字节[]
,并将其传递给Encoding.GetString()
方法-类似于zaitsman所介绍的方法。您的两个应用程序是否作为两个单独的进程运行
如果是这样,则不能直接发送string
,因为它将包含一些在另一个进程的地址空间中无效的内部指针。您不知道STRING类包含什么-它是隐藏的。因此,它可能包含它们,而不是“肯定包含”
(尽管在C#/.Net中它肯定包含)
您已经开始得很好了:您需要将该字符串的内容打包到一个原始字节数组中,自己保证它只包含数据而不包含指针,然后将原始数组发送到第二个进程
问题的核心是COPYDATA
结构的p/Invoke定义错误。lpVoid
不应为string
类型,而应为byte[]
或IntPtr
类型。一旦将其类型更改为byte[]
,编译器将立即显示“=msg”和“.Split”无效
请注意,您当前的发送代码只包含一个错误:您提供的“数据长度”是数组的长度(正确),但它传递的是“msg”,而不是数组“sarr”。修复lpVoid类型后,只需将字段设置为sarr
然后,在接收端,您需要获取COPYDATA,从中获取一个
lpVoid
,将其用作byte[]
,并将其传递给Encoding.GetString()
方法-类似于zaitsman呈现的内容。您没有对字节数组做任何操作……不,我按原样发送它。我还尝试将默认值更改为UTF8,但我没有查看您将lpData
设置为的内容-您将其设置为msg
,而不是sarr
。您仅使用字节数组来查找要设置的长度。如果将cds.lpData=msg
更改为cds.lpData=sarr
,则可能有效。将编码也更改为UTF8。请忽略“重复标志”。我对这个问题考虑的时间不够长,现在我不知道如何取消它。在链接的帖子中,他们使用类似于cbdata=str.length+1
的内容。这对于多字节编码显然是错误的,因为它肯定会导致消息的数据被截断。请继续使用您的解决方案。您没有对字节数组执行任何操作…不,我按原样发送。我还尝试将默认值更改为UTF8,但我没有查看您将lpData
设置为的内容-您将其设置为msg
,而不是sarr
。您仅使用字节数组来查找要设置的长度。如果将cds.lpData=msg
更改为cds.lpData=sarr
,则可能有效。将编码也更改为UTF8。请忽略“重复标志”。我对这个问题考虑的时间不够长,现在我不知道如何取消它。在链接的帖子中,他们使用类似于cbdata=str.length+1
的内容。这对于多字节编码显然是错误的,因为它肯定会导致消息的数据被截断。请继续使用您的解决方案。Sara Saeed我只使用默认值,因为这是您在应用程序1中使用的。编码必须在两者之间匹配。如果您需要UTF8,请将System.Text.Encoding.Default.GetString()
替换为System.Text.Encoding.UTF8.GetString()
。Sara Saeed我只使用默认值,因为这是您在应用程序中使用的。编码必须在两者之间匹配。如果需要UTF8,请将System.Text.Encoding.Default.GetString()
替换为System.Text.Encoding.UTF8.GetString()
。