У меня действительно раздражающая проблема:
Я работаю над совместным текстовым редактором в 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.So на обратный вызов 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;
}
}
Но моя настоящая проблема заключается в следующем: я не могу точно определить escape-символы, потому что я отправил байтовый массив, я конвертирую его в строку, а затем пытаюсь обновить textBox каждого клиента этой строкой. Например, когда я нажимаю клавишу Shift, строка во всем TextBox клиента будет «shiftKey». Можете ли вы сказать мне, пожалуйста, как обращаться с этими управляющими символами? Есть ли метод для отправки и обновления в ASCII.