KeyDown识别左右方​​向箭头键,但不能上下

时间:2012-05-09 16:44:47

标签: c# winforms keydown keycode arrow-keys

使用下面的代码,左箭头键和右箭头键按预期运行,但无法识别向上和向下箭头(单步执行它,在适当的情况下满足前两个条件,但后两个条件永远不会):< / p>

private void textBox1_KeyDown(object sender, KeyEventArgs e) {
    TextBox tb = (TextBox)sender;

    if (e.KeyCode.Equals(Keys.Left)) {
        SetFocusOneColumnBack(tb.Name);
        e.Handled = true;
        return;
    }
    if (e.KeyCode.Equals(Keys.Right)) {
        SetFocusOneColumnForward(tb.Name);
        e.Handled = true;
        return;
    }
    if (e.KeyCode.Equals(Keys.Up)) {
        SetFocusOneRowUp(tb.Name);
        e.Handled = true;
        return;
    }
    if (e.KeyCode.Equals(Keys.Down)) {
        SetFocusOneRowDown(tb.Name);
        e.Handled = true;
        return;
    }
}

为什么会这样,我该如何解决?

更新

这是我在踩过e.Keycode时看到的内容。如果我按了

  • ...左箭头键,我看到:e.KeyCode = "LButton | MButton | Space"
  • ...右箭头键,我看到:e.KeyCode = "LButton | RButton | MButton | Space"
  • ...向上箭头键,我看到:e.KeyCode = "RButton | MButton | Space"
  • ...向下箭头键,我看到:e.KeyCode = "Backspace | Space"

这让我感到困惑(它向我展示的是什么),但是在keyleft和keyright上,我的代码被输入了 - 无论我是多么努力地咬紧牙关,它都不会用于键盘和键盘。

4 个答案:

答案 0 :(得分:3)

Windows会在每次发送到您的表单之前捕获用于UI导航的某些键。如果要覆盖此行为,则需要重载IsInputKey方法(并将文本字段子类化):

    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Right)
            return true;
        return base.IsInputKey(keyData);
    }

答案 1 :(得分:3)

我发现使用PreviewKeyDown确实有效(我必须删除“e.Handled = true”代码,因为它不适用于PreviewKeyDown事件):

private void textBoxQH1_PreviewKeyDown(object sender,   PreviewKeyDownEventArgs e) {
    TextBox tb = (TextBox)sender;

    if (e.KeyCode.Equals(Keys.Up)) {
        SetFocusOneRowUp(tb.Name);
        return;
    }
    if (e.KeyCode.Equals(Keys.Down)) {
        SetFocusOneRowDown(tb.Name);
        return;
    }
}

因此,需要三个不同的事件来处理我正在寻找的各种键:常规字符的KeyPress,非字符的KeyDown(左右箭头键)和上下箭头键的这一个(PreviewKeyDown)

答案 2 :(得分:1)

您可以使用此代码:

private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
            //Do stuff
            break;
        case Keys.Down:
            //Do stuff
            break;
        case Keys.Left:
            //Do stuff
            break;
        case Keys.Right:
            //Do stuff
            break;
    }
}

答案 3 :(得分:1)

派对太迟了,但如果有人有兴趣,请使用e.KeyValue代替,例如,e.KeyValue左箭头键为37,右箭头键为{{1}等等。