Совместный текстовый редактор

У меня действительно раздражающая проблема: я работаю над совместным текстовым редактором на 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.

1 ответ

Решение

Я не уверен на 100%, что задает ваш вопрос - но если вы хотите отфильтровать строку, содержащую неконтрольные символы, вы можете использовать это - если вы измените свой код на использование OnKeyPress событие, а не OnKeyDown:

if(!char.IsControl(e.KeyChar))
{
    //Do Stuffz
}

Есть много вещей для тестирования кодов клавиш на объекте 'char', который вы можете использовать.

char.IsLetterOrDigit, char.IsPunctuation.. так далее

Другие вопросы по тегам