按键可识别左右方向箭头键,但不能识别向上和向下方向箭头键

本文关键字:方向 识别 但不能 左右 | 更新日期: 2023-09-27 18:33:51

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

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"

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

按键可识别左右方向箭头键,但不能识别向上和向下方向箭头键

Windows 会在 UI 导航的某些键发送到窗体之前捕获它们。如果要重写此行为,则需要重载 IsInputKey 方法(并对文本字段进行子类化):

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

我发现使用 PreviewKeyDown 确实有效(我不得不删除"e.Handle = 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;
    }
}

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

您可以使用以下代码:

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;
    }
}

对于派对来说为时已晚,但如果有人感兴趣,请使用e.KeyValue,例如,左箭头键e.KeyValue 37,右箭头键39等等。