【问题标题】:KeyPress on entire form, not just one object?KeyPress 在整个表单上,而不仅仅是一个对象?
【发布时间】:2012-12-27 23:18:59
【问题描述】:

我正在使用 C# 制作 pong,但遇到了一个问题。我打开了 KeyPreview,这是我的代码

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Up || e.KeyChar == (char)Keys.W) {
        picPaddle.Top -= 10;
    }
    else if (e.KeyChar == (char)Keys.Down || e.KeyChar == (char)Keys.S) {
        picPaddle.Top += 10;
    }
}

当我按下任何键时,什么都没有发生。按键唯一起作用的情况是它测试 (char)Keys.Enter 的条件。为什么是这样?如何使表单采用 KeyPress 键而不是输入键?

【问题讨论】:

  • 在第一个 if 上设置断点 - 任何按键都会中断执行吗?如果是这样,请调查 e 以获取有关您的条件未得到满足的线索。

标签: c# .net events keypress


【解决方案1】:

尝试重写 KeyDown 方法:

protected override void OnKeyDown(KeyEventArgs e) {
  if (e.KeyCode == Keys.Up || e.KeyCode == Keys.W) {
    picPaddle.Top -= 10;
  } else if (e.KeyCode == Keys.Down || e.KeyCode == Keys.S) {
    picPaddle.Top += 10;
  }

  base.OnKeyDown(e);
}

另见What's the difference between KeyDown and KeyPress in .NET?

【讨论】:

  • @WillumMaguire 简而言之,向上和向下键不是字符。
【解决方案2】:

KeyPress 事件在控件获得焦点时起作用。 keydown 事件始终有效。 => 拦截keydown事件

【讨论】:

  • 根据问题,正在使用表单的 KeyPress 事件(以及将 KeyPreview 属性设置为 true)。在这种情况下,KeyDown、KeyPress 和 KeyUp 都可用于表单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2015-06-29
  • 1970-01-01
相关资源
最近更新 更多