Member 13697757 Ответов: 2

C# keydown не работает, когда у меня есть кнопка


Я видел в интернете эту проблему, и решение состояло в том, чтобы установить "KeyPreview" на "true". Я пробовал это, и это все еще не сработало. Почему, когда я нажимаю одну из стрелок (вниз, вверх, влево или вправо), ярлык все еще не появляется?

Обновленный:
Спасибо вам за ваш ответ, Питер Вегтер, но он все равно не работает.
Чтобы было понятно: обычное письмо делает работает и заставляет этикетку выпендриваться. Все дело в том, что стрелки (вниз, вверх, влево или вправо) не работа.
Я думаю, что знаю почему - "фокус" находится на кнопке, а не на форме.
Я искал это в интернете и обнаружил, что мне нужно сделать так, чтобы "KeyPreview" был установлен как "true". Я сделал это, и все равно он не показывает ярлык, когда я нажимаю стрелки, только когда я нажимаю буквы.
Если я уберу кнопку, стрелки исчезнут. делать работа.

Что я уже пробовал:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Visible = false;
            this.KeyPreview = true;
            this.KeyDown += Form1_KeyDown;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            label1.Visible = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }

#realJSOP

Установите точку останова в обработчике событий KeyDown и посмотрите, обрабатывает ли код вообще это событие.

Peter Vegter

Моя ошибка, я обновил свой ответ. Это должно сработать.

Peter Vegter

Я снова попробовал "Решение 1" с несколькими кнопками и метками на форме, а также с различными платформами .NET, и это решение по-прежнему хорошо работает со мной.
Может быть, вы ошиблись где-то еще в своем коде?

2 Ответов

Рейтинг:
18

Peter Vegter

Вы должны использовать ProcessCmdKey, чтобы "поймать" стрелку (и некоторые другие) клавиши, например:

public Form1()
{
    InitializeComponent();
    label1.Visible = false;
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    switch (keyData)
    {
        case Keys.Left: // left arrow key
            label1.Visible = true;
            return true;

        case Keys.Right: // right arrow key
            label1.Visible = true;
            return true;

        // etc.
    }
    return base.ProcessCmdKey(ref msg, keyData);
}


den2k88

Я поддержал его и поставил в закладки: он мне, вероятно, понадобится в ближайшем будущем, и я бы наткнулся на то же препятствие :D

Peter Vegter

Это очень мило, спасибо!

Nelek

ОП отредактировал этот вопрос (Да, это тоже удивило меня, 1,5 года спустя), и он упоминает вас. Возможно, вы заинтересуетесь проверкой

Peter Vegter

Спасибо, Нелек!
Я снова протестировал это решение, и оно все еще работает (см. ответ выше). И да, хороший результат через 1,5 года! :)

Richard Deeming

На самом деле ОП обновила этот вопрос еще в феврале 2018 года. "Обновленная" дата вопроса относится к дате публикации решения 2.

Если вы нажмете на ссылку "v2" рядом с датой, то увидите полная история изменений для этого вопроса[^]. :)

Peter Vegter

- Спасибо, Ричард. Я просто не проверил сообщение для меня должным образом.

Nelek

Я исправился. Спасибо за информацию.

Nelek

МММ... Если я перейду к ревизиям - > показать незначительные ревизии - > версия 4 будет от 25 октября 2019 года. Выбор версий 4 и 2 показывает некоторые изменения...
Но между 3 и 4 нет никаких изменений

Я не знал, что публикация ответа дает второстепенную версию вопроса.
Запутанным...

Richard Deeming

Я подозреваю, что где-то притаился жук. v3, похоже, это то, что показывает, что было с февраля 2018 года. Но список ревизий, похоже, предполагает, что v2-Это текущая версия, которая соответствует ссылке на вопрос. Кажется, между v3 и v4 нет никаких изменений.

Nelek

Вы сообщаете об этом? Или я должен?

Richard Deeming

Я только что доложил об этом. :)

Ошибки и предложения[^]

Nelek

Спасибо

Рейтинг:
1

Member 14635180

Место : это.Focus(); в вашей кнопке после всего кода, который делает кнопка,

Проблема в том, что когда кнопка нажата, она имеет фокус, и ваши события KeyDown и KeyUp не будут срабатывать. Переориентируйтесь на форму после нажатия кнопки, и тогда ваши ключевые события снова сработают.