【问题标题】:Handle pressing up arrow on keyboard when focus is on button当焦点在按钮上时,处理按下键盘上的向上箭头
【发布时间】:2016-11-29 21:33:13
【问题描述】:

当用户按下键盘上的向上箭头,而按钮具有焦点时,我必须捕捉到这一点。我编写了这段代码来处理按钮的 KeyUp 事件:

private void btnValider_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Up)
    {
        //do stuff
    }
}

但此函数无法处理按向上箭头键。

我不知道我想做的事情是否可行,或者我是否必须从表单中处理这个事件?

【问题讨论】:

  • 初始化时在表单中添加PreviewKey = true;。然后您可以检查表单中的输入,例如void meForm_KeyUp(object sender, KeyEventArgs e) { if(btnValidaer.HasFocus) { /*logic here*/ } } 或者您可以添加IMessageFilter 接口,或者您可以覆盖WndProc(ref Message msg) 方法
  • 参见documentation for KeyUp: - “某些键,例如 TAB、RETURN、ESC 和 箭头键由控件自动处理。拥有这些键引发 KeyUp 事件,您必须覆盖表单上每个控件中的 IsInputKey 方法。覆盖 IsInputKey 的代码需要确定是否按下了某个特殊键并返回 true 值。"
  • @m.rogalski PreviewKey 仅在 Form 上可用,它无助于捕捉箭头键
  • 箭头键和 Tab 用于导航。所以你永远不会得到那个事件,它在到达按钮之前就被拦截了。使用 KeyPreview 也不是解决办法。目前还不清楚 Keys.Up 需要做什么,因此最佳解决方案并不明显。覆盖 ProcessCmdKey() 以进行通用修复。

标签: c# winforms


【解决方案1】:

正如Hans Passant 建议的那样,

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Up && btnValider.Focused)
        {
            MessageBox.Show("hit");

            return true;
        }
        else
            return base.ProcessCmdKey(ref msg, keyData);
    }

【讨论】:

  • 没有义务添加'&& btnValider.Focused'。 'if (keyData == Keys.Up)' 就足够了。我已经测试过了。
【解决方案2】:

处理按钮的按键事件。

【讨论】:

  • 同样的问题:" 某些键,例如 TAB、RETURN、ESC 和箭头键由控件自动处理。要让这些键引发 KeyDown 事件 … "
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多