我遇到了一个非常烦人的问题:我正在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);
}
}
现在,连接到应用程序的客户端列表中的每个客户端都应该接收到带有文本框输入的字节数组。因此,在每个客户端的"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发送和更新的方法。
我不能100%确定你的问题是在问什么-但如果你想过滤一个包含非控制字符的字符串,你可以使用这个-如果你把代码改为使用OnKeyPress
事件,而不是OnKeyDown
:
if(!char.IsControl(e.KeyChar))
{
//Do Stuffz
}
有很多东西可以在你可以使用的"char"对象上测试键代码。
char.IsLetterOrDigit, char.IsPunctuation
。。etc