KeyDown распознает клавиши со стрелками влево и вправо, но не вверх и вниз

С кодом ниже, клавиши со стрелками влево и вправо функционируют как ожидалось, но стрелки вверх и вниз не распознаются (шагая через него, первые два условия выполняются там, где это необходимо, но вторые два никогда не являются):

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 мой код вводится - он никогда не для keyup и keydown, независимо от того, как сильно я сжимаю зубы.

4 ответов


Windows захватывает определенные клавиши для навигации по пользовательскому интерфейсу, прежде чем они будут отправлены в вашу форму. Если вы хотите переопределить это поведение, вам нужно перегрузить IsInputKey метод (и подкласс текстового поля):

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

Я считаю, что использование 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;
    }
}

Итак, для обработки различных клавиш, которые я искал, были необходимы три разных события: нажатие клавиш для обычных символов, 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 и так далее.