Состояние клавиш

52

Когда происходит нажатие клавиши, часто бывает необходимо знать больше, чем просто какая именно клавиша была нажата. Кроме этого, важно знать, какие еще клавиши были прижаты в это же время. Это означает, что может понадобиться проанализировать состояние остальных клавиш, особенно модификаторов вроде <Shift>, <Ctrl> и <Alt>.

События клавиш (PreviewKeyDown, KeyDown, PreviewKeyUp и KeyUp) позволяют получить эту информацию. Во-первых, объект KeyEventArgs содержит свойство KeyState, которое отражает свойство клавиши, сгенерировавшей событие. Есть еще одно, более полезное, свойство KeyboardDevice, которое предоставляет такую же информацию для любой клавиши на клавиатуре.

Неудивительно, что свойство KeyboardDevice предоставляет экземпляр класса KeyboardDevice. Его свойства содержат информацию о том, какой элемент в данный момент имеет фокус (FocusedElement) и какие клавиши-модификаторы были прижаты в момент возникновения события (Modifiers). К клавишам-модификаторам относятся <Shift>, <Ctrl> и <Alt>; их состояние можно проверить с помощью следующего кода:

if ((е.KeyboardDevice.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
   lblInfо.Text = "Вы нажали клавишу модификатор...";
}

Класс KeyboardDevice тоже предоставляет несколько удобных методов, которые перечислены ниже. Каждому из них нужно передать значение из перечисления Key:

IsKeyDown()

Сообщает, была ли прижата данная клавиша в момент возникновения события

IsKeyUp()

Сообщает, была ли отпущена (не прижата) данная клавиша в момент возникновения события

IsKeyToggled()

Сообщает, находилась ли данная клавиша во "включенном" состоянии в момент возникновения события. Это относится лишь к клавишам, которые могут быть включены или выключены: <Caps Lock>, <Scroll Lock> и <Num Lock>

GetKeyStates()

Возвращает одно или несколько значений из перечисления KeyStates и сообщает, является ли данная клавиша прижатой, отпущенной, включенной или выключенной. По сути, дублирует вызов методов IsKeyDown() и IsKeyUp() с передачей им той же клавиши

При использовании свойства KeyEventArgs.KeyboardDevice код получает состояние виртуальной клавиши — состояние клавиатуры в момент возникновения события. Оно не обязательно совпадает с текущим состоянием клавиатуры. Например, допустим, что пользователь вводит данные быстрее, чем выполняется их обработка в коде. При каждом возникновении события KeyPress вы будете иметь доступ к клавише, сгенерировавшей событие, а не к уже введенным символам. Как правило, именно такое поведение и нужно.

Однако в событиях клавиатуры вы не ограничены получением лишь информации о клавише. Получать состояние клавиатуры можно в любой момент времени. Для этой цели предназначен класс Keyboard, который очень похож на класс KeyboardDevice, но состоит из статических членов. Вот пример использования класса Keyboard для проверки текущего состояния левой клавиши <Shift>:

if (Keyboard.IsKeyDown(Key.LeftShift))
{
   lblInfo.Text = "Левая клавиша Shift прижата";
}

Класс Keyboard содержит также методы, которые позволяют прикреплять обработчики событий клавиатуры уровня всего приложения: AddKeyDownHandler() и AddKeyUpHandler(). Однако применять эти методы не рекомендуется. Лучше реализовать функциональность уровня приложения с помощью системы команд WPF.

Пройди тесты
Лучший чат для C# программистов