首页 文章

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

提问于
浏览
6

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

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 回答

  • 1

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

    protected override bool IsInputKey(Keys keyData)
        {
            if (keyData == Keys.Right)
                return true;
            return base.IsInputKey(keyData);
        }
    
  • 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) .

  • 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

    派对太晚了,但如果有人感兴趣,请使用 e.KeyValue 作为示例,左箭头键为 e.KeyValue37 ,右箭头键为 39 ,依此类推 .

相关问题