события клавиатуры в .NET - PullRequest
       11

события клавиатуры в .NET

2 голосов
/ 10 февраля 2009

Событие нажатия клавиши запускается при отпускании ключа. Это справедливо для обычных клавиш, таких как a, b и т. Д. Однако, удерживая нажатой клавишу со стрелкой или клавишу escape, вы получите другой результат. Вместо того, чтобы запускать событие нажатия клавиши при отпускании ключа, он запускается вскоре после события нажатия клавиши. Таким образом, нажатие клавиши со стрелкой становится равно нажатию и отпусканию клавиши много раз очень быстро. Любое объяснение и обходной путь, чтобы определить, когда ключ действительно выпущен?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2009

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

Мой обходной путь - отключить обработчик KeyDown после обнаружения события KeyDown с помощью

RemoveHandler Me.KeyDown, AddressOf Form1_KeyDown

и повторное включение при возникновении события KeyUP.

AddHandler Me.KeyDown, AddressOf Form1_KeyDown

Конечно, если вы хотите обрабатывать несколько нажатий одновременно, это не сработает. Вам нужно будет сохранить информацию о том, был ли данный ключ отключен, и игнорировать соответствующее событие KeyDown.

1 голос
/ 19 июня 2009

Я только что столкнулся с подобной проблемой. Обработчик клавиатуры ведет себя странно:

Если фокус и обработчики находятся в текстовом поле:

  • Когда зажата буквенно-цифровая клавиша, я получил несколько событий нажатия и нажатия
  • Стрелки и функциональные клавиши производят несколько событий вниз

Если обрабатывать события для формы с включенным KeyPreview, обрабатывается только событие KeyUp для клавиш со стрелками.

Возможно обработать все ключи на более низком уровне, переопределив ProcessCmdKey.

Если вы хотите использовать левую клавишу со стрелкой:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
    Select Case keyData
        Case Keys.Left
            Debug.WriteLine("Left")
            Return True
        Case Else
            Return MyBase.ProcessCmdKey(msg, keyData)
    End Select
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...