【问题标题】:KeyDown event doesn't raiseKeyDown 事件不会引发
【发布时间】:2011-10-14 19:30:16
【问题描述】:

我有一个带有按钮的表单。我想捕获 Form.KeyDown 事件。

private void buttonStart_Click(object sender, EventArgs e)
{
   if (!this.gameRunning)
   {
       this.buttonStrat.Text = "Pause";
       this.timer1.Enabled = true;
   }
   else
   {
       this.buttonStart.Text = "Continue";
       this.timer1.Enabled = false;
   }
   this.gameRunning = !this.gameRunning;
}

但是,我在不支持 PAUSE 的情况下禁用了 buttonStart,它运行良好。由于我添加了 PAUSE 优势,Form.KeyDown 事件不会引发,buttonStart 是Focused。每当我禁用 buttonStart 时,它就会触发。

注意事项:

  • 我已将Form.KeyPreview 设置为true,静止不动
  • 我已将Form.AcceptButton 设置为null,静止不动
  • 我已将 buttonStart 订阅到 Form.KeyDown,但仍然没有。

【问题讨论】:

  • 覆盖表单的 OnProcessCmdKey() 以可靠地捕获快捷键。

标签: c# .net winforms


【解决方案1】:

我希望这会对你有所帮助..


覆盖 IsInputKey 行为


您必须覆盖 IsInputKey 行为,以告知您希望将右箭头键视为 InputKey 而不是特殊行为键。 为此,您必须覆盖每个控件的方法。 我建议您创建您赢得的按钮,比如说 MyButton

下面的类创建了一个自定义 Button,它覆盖了 IsInputKey 方法,这样右箭头键就不会被视为特殊键。从那里您可以轻松地为其他箭头键或其他任何东西制作它。

    public partial class MyButton : Button
    {
        protected override bool IsInputKey(Keys keyData)
        {
            if (keyData == Keys.Right)
            {
                return true;
            }
            else
            {
                return base.IsInputKey(keyData);
            }
        }
    }

之后,您可以在每个不同的 Button 或表单本身中处理您的 keyDown 事件:

在按钮的 KeyDown 方法中尝试设置这些属性:

private void myButton1_KeyDown(object sender, KeyEventArgs e)
{
  e.Handled = true;
  //DoSomething();
}

-- 或者--

处理表单中的常见行为:(不要在按钮中设置e.Handled = true;)

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    //DoSomething();
}

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多