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

C# KeyDown可识别左右方向箭头键,但不能识别上下方向键,c#,winforms,keydown,keycode,arrow-keys,C#,Winforms,Keydown,Keycode,Arrow Keys,使用下面的代码,左箭头键和右箭头键按预期工作,但无法识别上箭头和下箭头(通过它,前两个条件在适当的情况下得到满足,但后两个条件从未得到满足): 为什么会这样,我该如何修复它 更新 这是我在通过e.Keycode时看到的。如果我按 …左箭头键,我看到:e.KeyCode=“LButton | MButton | Space” …右箭头键,我看到:e.KeyCode=“LButton | RButton | MButton | Space” …向上箭头键,我看到:e.KeyCode=“RButto

使用下面的代码,左箭头键和右箭头键按预期工作,但无法识别上箭头和下箭头(通过它,前两个条件在适当的情况下得到满足,但后两个条件从未得到满足):

为什么会这样,我该如何修复它

更新 这是我在通过e.Keycode时看到的。如果我按

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

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

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


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


因此,需要三个不同的事件来处理我正在寻找的各种键:按键用于常规字符,按键用于非字符(左箭头键和右箭头键),这一个(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
等等。

在事件处理程序的开头放置一个断点。它甚至需要上下键吗?如果没有,那么在这个处理程序得到机会之前,其他的东西正在获取事件并调用
e.Handled=true
。是的,我在我的原始帖子中提到了单步执行。好吧,当你单步执行时,
e.KeyCode
对于这两种情况有什么价值?好问题;上面的回答(更新了我的帖子)你有没有可能使用一个奇特的键盘?或者您正在为某个应用程序编码?使用
PreviewKeyDown
,您可以在任何其他操作都没有机会修改它之前进入
KeyCode
。我的猜测是,代码中的其他地方正在进行错误的位组合,并在到达KeyDown事件之前销毁代码。还要注意的是,在
PreviewKeyDown
事件中,您可以同样轻松地处理
键。Left
键。Right
这里是
PreviewKeyDown
事件,这意味着您只需要2个事件,而不是3个。我认为汉普斯·尼尔森回答了一个问题,即为什么左键和右键处理正确,而上下键处理不正确。这就是我的想法,在他们能够拦截之前拦截他们的拦截,试图切断关口的窗户。+1表示“在他们能够拦截之前拦截他们的拦截”
    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Right)
            return true;
        return base.IsInputKey(keyData);
    }
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;
    }
}
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;
    }
}