0

私は本当に厄介な問題を抱えています.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;
        }
    }

しかし、私の本当の問題は次のとおりです。バイト配列を送信したため、エスケープ文字をうまく識別できません。それを文字列に変換してから、すべてのクライアントのテキストボックスをその文字列で更新しようとします。たとえば、Shift キーを押すと、クライアントのすべての TextBox の文字列は「shiftKey」になります。これらのエスケープ文字の処理方法を教えてください。ASCII で送信および更新する方法はありますか。

4

1 に答える 1

0

私はあなたの質問が何を求めているのか100%わかりません-しかし、非制御文字を含むように文字列をフィルタリングしたい場合は、これを使用できます-コードを変更してOnKeyPressイベントを使用する場合:代わりにOnKeyDown

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

使用できる「char」オブジェクトのキーコードをテストするものはたくさんあります。

char.IsLetterOrDigit, char.IsPunctuation..など

于 2012-03-22T12:20:17.667 に答える