Проблема с нажатием клавиши C #? - PullRequest
0 голосов
/ 09 августа 2011

У меня есть таймер обратного отсчета - пользователь вводит значения, а затем запускает новую форму - минимальный размер один или максимальный размер на основе переключателя, выбранного из первой формы. В пользовательской форме управления есть кнопки для паузы / остановки таймера и т. Д. Однако я хочу добавить и то же самое, если нажата кнопка клавиатуры.

Вот код для нажатия кнопки паузы ...

    private void btnPause_Click (object sender, EventArgs e)
    {
        _CountdownTimer.Pause ();
    }

Это работает нормально, и если нажать кнопку паузы, она приостанавливает таймер. Затем я попытался добавить следующий код для KeyDown - кто-нибудь знает, почему это не будет работать? Когда я нажимаю p, он просто продолжает обратный отсчет .....

Спасибо.

    private void btnPause_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode.ToString() == "p")
        {
            _CountdownTimer.Pause();
        }
    }

Ответы [ 5 ]

2 голосов
/ 09 августа 2011

Событие KeyDown доставляет виртуальные ключи. Как Keys.P. Если вы хотите обнаружить клавиши ввода, например «p», вам следует использовать вместо этого событие KeyPressed.

Но это не правильный путь. Элемент управления Button уже знает, как отображать и обрабатывать сочетания клавиш. Установите для его свойства Text значение & Pause. Символ & обозначает мнемонику, P подчеркивается, как только пользователь нажимает клавишу Alt. А нажатие Alt + P автоматически вызывает событие Click. Стандарт интерфейса пользователя Windows, не нужно обучать пользователя. Еще одно существенное преимущество такой работы заключается в том, что кнопка не должна быть сфокусированной. И вам не нужно писать код. Рекомендуемые.

2 голосов
/ 09 августа 2011

Правильное свойство KeyCode

private void btnPause_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.P)
    {
        _CountdownTimer.Pause();
    }
}

А лучше использовать Form's KeyDown Event.

2 голосов
/ 09 августа 2011

Событие KeyDown вызывается только в том случае, если элемент управления имеет фокус.Вы должны использовать событие KeyDown из формы, чтобы проверить, нажимает ли пользователь клавишу p.

Кроме того, e.KeyCode не обязательно должен быть строкой.Просто проверьте Keys перечисление.

2 голосов
/ 09 августа 2011

Это потому, что e.KeyCode.ToString() не возвращает "p" Правильный код:

private void btnPause_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.P)
        {
            _CountdownTimer.Pause();
        }
    }

Вы должны использовать отладчик и установить точки останова, чтобы убедиться, что событие запускается. Если событие сработало, убедитесь, что оно входит в if.

1 голос
/ 09 августа 2011

Если я правильно понял, то вы пытаетесь понять, что когда пользователь нажимает кнопку «p» во время работы таймера, часы должны быть остановлены. в случае, если кнопка не сфокусирована, событие keydown будет инициировано родителем кнопки, то есть самой формой. поэтому вам нужно обработать событие KeyDown формы с помощью кода, предложенного Skomski.

...