logo
03

Взаимодействие с клавиатурой

Обычно контрол получает события от клавиатуры только в том случае, если он находится в фокусе. В простом контроле достаточно переопределить OnKeyDown и/или OnKeyPress, чтобы получить информацию о нажатых кнопках. Однако контейнеры (например, форма) могут перехватывать обработку нажатий клавиш раньше, чем они дойдут до текущего контрола.

При необходимости различать нажатие клавиш с клавишами-модификаторами, такими как Control, Shift, Alt, используйте свойство Modifiers полученного в обработчике объекта KeyEventArgs или отдельные свойства Control, Shift и Alt. Используйте свойство KeyCode этого объекта, если вы хотите получить код нажатой клавиши отдельно, и свойство KeyData, если вам нужно значение, комбинированное с управляющими клавишами. Также имеется свойство KeyValue, которое является целым числом, представляющим KeyData.

Для получения управляющих клавиш, вроде Tab, Return, Escape и стрелочек, которые обычно обрабатываются формой или другим контейнером, необходимо перегрузить метод IsInputKey и вернуть для нужных клавиш значение true. В противном случае такие кнопки будут обработаны контейнером согласно собственным правилам и не достигнут вашего контрола. В некоторых случаях может понадобиться перегрузить ProcessCmdKey или ProcessDialogKey.

Поддержка дизайнера форм и редактора

Хороший контрол должен быть удобен не только во время выполнения, но и при использовании его в дизайнере форм. Подробный рассказ о собственном дизайнере или редакторе выходит за рамки данной статьи, однако многие вещи довольно просты и могут резко повысить удобство использования вашего контрола во время дизайна.