Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在windowsmessages上发送俄语和阿拉伯语字符?_C# - Fatal编程技术网

C# 如何在windowsmessages上发送俄语和阿拉伯语字符?

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

我有两个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;

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()