2014-11-03 83 views
0

所以我想製作一個方法來讀取keypress事件,然後將擊鍵記錄到一個字符串中。這個想法是,該字符串包含前面的「R」或「L」,後跟2個整數。但是,當我在MoveBox方法中顯示「MoveDist」字符串變量時,它總是按相同的按鍵重複3次,而不是在每次筆畫後重新輪詢鍵盤。例如,當我運行調試並輸入「R」時,程序崩潰,因爲輸入字符串立即變爲「rrr」。任何人都有解決方案?在按鍵事件閱讀多個鍵?

void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 

    String input = ""; 

     if (e.KeyChar == 108) 
     { 
      input = "l"; 
     } 
     else if (e.KeyChar == 114) 
     { 
      input = "r"; 
     } 
     else if (e.KeyChar >= 48 && e.KeyChar <= 57) 
     { 
      int charPress = e.KeyChar - 48; 
      input = input + charPress.ToString(); 
     } 

    Form1_MoveBox(input); 

} 

void Form1_MoveBox(String newInput) 
{ 
    String input = ""; 
    while (input.Length <= 3) 
    { 
     input = input + newInput; 
    } 
    String moveDist = input.Substring(1, 3); 

    MessageBox.Show(moveDist); 

    int distance = Int32.Parse(moveDist); 

    if (input.Substring(0, 1) == "l") 
    { 
     int x = panel1.Location.X - distance; 
     int y = panel1.Location.Y; 
     panel1.Location = new Point(x, y); 
     panel1.Visible = true; 
    } 
    else if (input.Substring(0, 1) == "r") 
    { 
     int x = panel1.Location.X + distance; 
     int y = panel1.Location.Y; 
     panel1.Location = new Point(x, y); 
     panel1.Visible = true; 
    } 
+0

這段代碼有很多bug。通過在KeyPress事件處理程序之外移動* input *變量來開始修復它,以便在按鍵之間保留其值。花時間練習使用調試器,以便您自己診斷這些類型的錯誤。 – 2014-11-03 08:57:58

回答

0

使用KeyUp而不是KeyPress,因爲通常情況下,您應該在應用程序中處理KeyUp事件。直到用戶釋放密鑰之後才能在用戶界面中啓動操作。

訂購ofevents在這種情況下進行燒製

  1. 的KeyDown(一次性)
  2. 按鍵響應(直到鍵被按下,並基於對延遲操作系統設置和重複鍵盤的速度)
  3. KEYUP(一次)

可以防止KeyPress從多個發射時,關鍵是由用戶通過在一個布爾值設置爲true保持很長一段時間210,然後在KeyUp上設置爲false,但關於KeyUpKeyDown的好處是,無論用戶按下鍵多長時間,它們只會觸發一次,您可以避免「rrrrrrrrrrr」。

使用KeyUp的另一個好處是,你必須瞭解,如果Alt鍵,按下Ctrl或Shift狀或用戶輸入事件的ControlKeyCode屬性,您可以使用它,並將它與Keys比較多的附加信息以避免在您的代碼中使用某種e.KeyChar == 108,並使其更具可讀性,如e.KeyCode == Keys.R

0

如果按住鍵,按鍵事件也會觸發。所以如果你按了r鍵,它很可能會多次觸發。最好使用這個keydown事件。當你按下r鍵時它只會觸發一次,但如果你按住鍵不會繼續觸發。