按下按钮后执行KeyDown方法

时间:2012-10-22 20:21:16

标签: c# button keydown

好的,我的上一个问题并没有真正清楚,所以我将其删除并制作了这个。 我正在制作游戏' snake'。 我想要的是,在我选择一个难度之后,表单上的keydown需要工​​作 (你选择一个难度,蛇被拉动并开始移动,为了让它移动到你喜欢的方向,你按箭头键) 在我添加困难之前,它完美地运作了。 在我选择难度并想玩游戏后,蛇不动,我的钥匙在程序中没有反应。

所以我的问题= keyDown在选择难度后无法正常工作。

private void btnNormal_Click(object sender, EventArgs e)
{
  timer1.Interval = 250;
  btnNormal.Visible = false;
  btnEasy.Visible = false;
  btnHard.Visible = false;
  diffLabel.Visible = false;
  timer1.Enabled = true;
  down = false;
  up = false;
  right = true;
  left = false;

}

private void btnHard_Click(object sender, EventArgs e)
{
  timer1.Interval = 10;
  btnNormal.Visible = false;
  btnEasy.Visible = false;
  btnHard.Visible = false;
  diffLabel.Visible = false;
  timer1.Enabled = true;
  down = false;
  up = false;
  right = true;
  left = false;
}

private void btnEasy_Click(object sender, EventArgs e)
{
  timer1.Interval = 500;
  btnNormal.Visible = false;
  btnEasy.Visible = false;
  btnHard.Visible = false;
  diffLabel.Visible = false;
  timer1.Enabled = true;
  down = false;
  up = false;
  right = true;
  left = false;
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{

  if (e.KeyData == Keys.Down && up == false)
  {
    down = true;
    right = false;
    up = false;
    left = false;
  }

  if (e.KeyData == Keys.Up && down == false)
  {
    down = false;
    right = false;
    up = true;
    left = false;
  }

  if (e.KeyData == Keys.Right && left == false)
  {
    down = false;
    right = true;
    up = false;
    left = false;
  }

  if (e.KeyData == Keys.Left && right == false)
  {
    down = false;
    right = false;
    up = false;
    left = true;
  }
}

2 个答案:

答案 0 :(得分:1)

尝试将属性From.KeyPreview设置为true

从上面的链接,msdn说到这个:

  

如果表单将收到所有关键事件,则为true;如果是当前的假   表单上的选定控件接收键事件。默认是   假的。

     

当此属性设置为true时,表单将接收所有KeyPress,   KeyDown和KeyUp事件。表单的事件处理程序之后   完成按键操作后,按键分配到   有焦点的控制。例如,如果设置了KeyPreview属性   为true,当前选中的控件是一个TextBox,之后   keystroke由TextBox形式的事件处理程序处理   控件将收到按下的键。

简而言之,你的问题是焦点。您接收KeyDown事件的控件可能没有焦点。因此,无论接收事件的控件是否集中,我们都会强制执行表单以始终接收KeyDown事件。

答案 1 :(得分:1)

没有所有代码来测试它,很难通过判断......

但是,我的猜测是你在表单上添加了按钮。在这种情况下,如果按钮仍然具有焦点,则KeyDown事件不会发送到表单,而是发送到按钮。

我会将Form1_KeyDown方法转换为OnKeyDown基本方法的重写,并在构造函数中将PreviewKeys设置为true。

public MyForm()
{
    InitializeComponent();
    KeyPreview = true;
}

protected override void OnKeyDown(KeyEventArgs e)
{
    // Insert key presses logic
    base.OnKeyDown(e);
}