如何在Windows消息上发送俄语和阿拉伯语字符?

时间:2013-03-19 09:54:31

标签: 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;

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收到它时,我得到了问号“???????”,我认为它是字节数组编码的东西,但我不知道如何解决它

2 个答案:

答案 0 :(得分:2)

我在第二个代码中添加一行:

    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(',');

答案 1 :(得分:2)

您的两个应用程序是作为两个独立的进程运行的吗?

如果是这样,那么你就不能直接发送string,因为它将包含一些在其他进程的地址空间中无效的内部指针。你不知道STRING类包含什么 - 它是隐藏的。因此,它可能包含它们,而不是“肯定包含”。

(虽然在C#/ .Net中肯定包含)。

你已经开始了:你需要将该字符串的内容打包到一个原始字节数组中,保证它只包含数据而没有指针,然后将原始数组发送到第二个过程。

问题的核心是COPYDATA结构的错误P / Invoke定义。 lpVoid不应为string类型,但应为byte[]IntPtr类型。将类型更改为byte[]后,编译器将立即显示'= msg'和'.Split'无效。

请注意,您当前的发送代码只包含一个错误:您提供的“数据长度”是数组的长度(它是正确的),但它也会传递'msg',不是阵列'sarr'。修复lpVoid类型后,只需将字段设置为sarr

然后,在RECEIVING方面,您需要获取COPYDATA,从中获取lpVoid,将其用作byte[]并将其传递给Encoding.GetString()方法 - 类似于 zaitsman 的内容。