2013-06-18 113 views
0

在C#Winforms中,我嘗試捕獲向上箭頭鍵和向下箭頭鍵的KeyDown事件。因此,我做了以下內容:無法捕獲Windows窗體中向上/向下箭頭鍵的KeyDown事件

  1. 設置窗體的KeyPreview屬性爲true
  2. 覆蓋的形式「的onkeydown」方法的

無論如何,該方法從來沒有所謂的向上/向下鍵,儘管它被稱爲左/右箭頭鍵。然後我試着重寫窗體的OnKeyUp方法,只是爲了測試。現在奇怪的是,'OnKeyUp'方法也被稱爲向上/向下箭頭。我也嘗試覆蓋'ProcessCmdKey',結果相同:不會調用向上/向下箭頭。

爲什麼我不能使用KeyUp事件的原因是我需要認識到,如果按鍵保持按下一段時間,所以我需要多次調用該事件,而不是KeyUp的情況。

有什麼建議可能是這裏的問題?

回答

0
private bool downKey = false, rightKey = false, leftKey = false; 

private void TetrisGame_KeyDown(object sender, KeyEventArgs e) 
{ 
     Graphics g = Graphics.FromImage(canvas); 
     if (e.KeyCode == Keys.Down && CurrentBlock.canMoveDown()) 
     { 
      downKey = true; 
      CurrentBlock.moveDown(g); 
      if (rightKey && CurrentBlock.canMoveRight()) CurrentBlock.moveRight(g); 
      else if (leftKey && CurrentBlock.canMoveLeft()) CurrentBlock.moveLeft(g); 
     } 
     else if (e.KeyCode== Keys.Down) 
     { 
      downKey = true; 
      newBlock(); 
     } 
     else if (e.KeyCode == Keys.Right && CurrentBlock.canMoveRight()) 
     { 
      rightKey = true; 
      CurrentBlock.moveRight(g); 
      if (downKey && CurrentBlock.canMoveDown()) CurrentBlock.moveDown(g); 
       else if (downKey) newBlock(); 
     } 
     else if (e.KeyCode == Keys.Right) 
     { 
      rightKey = true; 
      if (downKey && CurrentBlock.canMoveDown()) CurrentBlock.moveDown(g); 
      else if (downKey) newBlock(); 
     } 
     else if (e.KeyCode == Keys.Left && CurrentBlock.canMoveLeft()) 
     { 
      leftKey = true; 
      CurrentBlock.moveLeft(g); 
      if (downKey && CurrentBlock.canMoveDown()) CurrentBlock.moveDown(g); 
      else if (downKey) newBlock(); 
     } 
     else if (e.KeyCode == Keys.Left) 
     { 
      leftKey = true; 
      if (downKey && CurrentBlock.canMoveDown()) CurrentBlock.moveDown(g); 
      else if (downKey) newBlock(); 
     } 
     this.Refresh(); 
} 

private void TetrisGame_KeyUp(object sender, KeyEventArgs e) 
{ 
     if (e.KeyCode == Keys.Down) 
      downKey = false; 
     else if (e.KeyCode == Keys.Right) 
      rightKey = false; 
     else if (e.KeyCode == Keys.Left) 
      leftKey = false; 
} 
+0

示例代碼。希望它能幫助您解決您的問題。 – Jack

0

似乎在我的項目中有一個自定義控件已經覆蓋了ProcessCmdKey方法。這種重寫吞噬了我的箭頭按鍵。直到現在我還不知道這個覆蓋。

0

檢入自定義控件基類中有哪些事件可用。然後覆蓋慾望事件或使用反射器來查看自定義控件DLL的內部代碼。

相關問題