我有一个非常讨厌的问题: 我正在使用C#中的协作文本编辑器,我想要从列表中的每个客户端编辑共享文本框,但我会被键盘转换中的字符卡住。 以下是keyDown事件的代码:
private void downKey(object sender, KeyEventArgs e)
{
try
{
byte[] data;
switch (e.KeyCode)
{
case Keys.Enter: data = Encoding.UTF8.GetBytes("enter");
break;
case Keys.Back: data = Encoding.UTF8.GetBytes("backspace");
break;
case Keys.Space: data = Encoding.UTF8.GetBytes("space");
break;
default:
data = Encoding.UTF8.GetBytes(e.KeyCode.ToString().ToLower());
break;
}
TcpClient.GetStream().Write(data, 0, data.Length);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
现在,连接到应用程序的客户端列表中的每个客户端都应该接收带有textBox的输入的字节数组。在每个客户端的“OnDataReceived”回调中将此字节数组转换为字符串并尝试通过crossThreadDelegate进行更新每个客户的文本框。
public void OnDataReceived(IAsyncResult asyn)
{
try
{
TcpSpecificPacket theSockId = (TcpSpecificPacket)asyn.AsyncState;
int dataReceivedLength = theSockId.thisClient.GetStream().EndRead(asyn);
if (dataReceivedLength != 0)
{
textBoxArrived.Invoke(changeCrossTextBox, new object[] {Encoding.UTF8.GetString(theSockId.dataBuffer, 0, dataReceivedLength)});
WaitForData();
}
}
catch (IOException)
{
}
现在是crossThread委托的定义:
private void changeCrossTextBox(string mesaj)
{
if (mesaj.Equals("enter"))
{
textBoxArrived.Text += Environment.NewLine;
}
else if (mesaj.Equals("space"))
{
textBoxArrived.Text += " ";
}
else if (mesaj.Equals("backspace"))
{
textBoxArrived.Text = textBoxArrived.Text.Substring(0, textBoxArrived.Text.Length - 1);
}
else
{
textBoxArrived.Text += mesaj;
}
}
但我真正的问题是下一个:我无法识别转义字符,因为我发送了一个字节数组,我将其转换为字符串,然后我尝试用该字符串更新每个客户端的textBox。例如,当我按下shift键时,客户端的所有TextBox中的字符串将是“shiftKey”。您能告诉我如何处理这些转义字符吗?是否有以ASCII格式发送和更新的方法。
答案 0 :(得分:0)
我不是100%确定您的问题是什么 - 但如果您希望过滤字符串以包含非控制字符,则可以使用此 - 如果您更改代码以使用OnKeyPress
事件而不是OnKeyDown
:
if(!char.IsControl(e.KeyChar))
{
//Do Stuffz
}
有很多东西可以测试你可以使用的'char'对象上的密钥代码。
char.IsLetterOrDigit, char.IsPunctuation
..等等