0

在 C# Winforms 中,我尝试捕获向上箭头和向下箭头键的 KeyDown 事件。因此我做了以下事情:

  1. 将表单的 KeyPreview 属性设置为 true
  2. 覆盖表单“OnKeyDown”方法

无论如何,该方法永远不会被向上/向下键调用,尽管它被称为向左/向右箭头键。然后我也尝试覆盖表单'OnKeyUp'方法,只是为了测试。奇怪的是现在向上/向下箭头也调用了“OnKeyUp”方法。我还尝试覆盖“ProcessCmdKey”,结果相同:向上/向下箭头不调用它。

我不能使用 KeyUp 事件的原因是我需要意识到按键是否持续按下一段时间,所以我需要多次调用该事件,而 KeyUp 不是这种情况。

关于这里可能是什么问题的任何建议?

4

3 回答 3

0

我的项目中似乎有一个自定义控件已经覆盖了 ProcessCmdKey 方法。这个覆盖吞噬了我的箭头键。直到现在我才知道这个覆盖。

于 2013-06-18T09:33:00.290 回答
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;
}
于 2013-06-18T09:03:20.283 回答
0

检查自定义控件基类有哪些可用的事件。然后覆盖期望事件或使用反射器查看自定义控件 Dll 的内部代码。

于 2013-06-18T13:07:02.230 回答