2012-03-22 137 views
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.So對everyclient的「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鍵時,客戶端的所有文本框中的字符串都將是「shiftKey」。請告訴我如何處理這些轉義字符?是否有一種方法可以用ASCII發送和更新。

回答

0

我不是100%確定你的問題在問什麼 - 但是如果你想過濾一個字符串來包含非控制字符,你可以使用這個 - 如果你改變你的代碼來使用OnKeyPress事件,而不是OnKeyDown

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

有很多的東西到「字符」對象,你可以使用測試鍵碼。

char.IsLetterOrDigit, char.IsPunctuation ..等

+0

謝謝! – 2012-03-22 21:18:46