Что происходит, так это то, что клавиши со стрелками перемещаются по элементам управления в форме, подобно клавише Tab . Каждое нажатие клавиши со стрелкой перемещает фокус с текущего активного элемента управления на следующий элемент управления в том же относительном направлении, что и клавиша со стрелкой.
Эта интерпретация клавиш со стрелками реализована на более высоком уровне, чем событие KeyDown
формы, которое вы обрабатываете. Каждое нажатие клавиши фактически используется функцией ProcessDialogKey
, которая предотвращает передачу этого события клавиши в ваш метод KeyHandling
для дальнейшей обработки.
Причина, по которой все работает так, как вы ожидаете, когда удерживается клавиша Ctrl , заключается в том, что функция ProcessDialogKey
не использует эти события, что позволяет передавать их в ваш метод-обработчик событий. Документация о методе говорит нам:
Метод не обрабатывает нажатия клавиш, которые включают модификаторы ALT или CONTROL.
Если вы не хотите, чтобы клавиши со стрелками перемещались между вашими элементами управления, и только «нажимали» на кнопки с точно названными именами, решение должно быть очевидным: вам нужно переопределить метод ProcessDialogKey
, добавить собственную логику обработки клавиш и верните значение "True", чтобы указать, что вы обработали ключ самостоятельно. В противном случае вы пойдете дальше и вызовете базовый класс, чтобы не нарушать стандартную обработку таких вещей, как Tab и Enter . Опять же, документация здесь очень свежа:
При переопределении метода ProcessDialogKey
в производном классе элемент управления должен возвращать true, чтобы указать, что он обработал ключ. Для ключей, которые не обрабатываются элементом управления, должен быть возвращен результат вызова метода ProcessDialogChar
базового класса.
Просто добавьте следующий код в вашу форму и удалите метод KeyHandling
, который у вас есть сейчас:
Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
Select Case keyData
Case Keys.Left
btnPrev.PerformClick()
Return True
Case Keys.Right
btnNext.PerformClick()
Return True
Case Keys.Up
btnFirst.PerformClick()
Return True
Case Keys.Down
btnLast.PerformClick()
Return True
End Select
Return MyBase.ProcessDialogKey(keyData)
End Function