Как реализовать отслеживание и отображение текущих нажатий клавиш с использованием текстового поля WPF?

#c# #.net #wpf #keyboard #keyboard-shortcuts

#c# #.net #wpf #клавиатура #сочетания клавиш

Вопрос:

Как в Visual Studio > Options > Keyboard > Press shortcut keys field .

Могу ли я сохранить это нажатие клавиши как одно объединенное значение или мне нужно сохранить нажатие клавиши и каждую клавишу-модификатор отдельно?

Я просто хочу показать текущие нажатые клавиши в TextBox виде:

 Ctrl G
Alt X
Shift V
R
Ctrl Alt S
etc
  

Также ищем наилучший способ сохранить значение нажатия клавиши. Если мне придется хранить ключи и ключи-модификаторы отдельно, то я создам новый тип, в котором они все будут в одном месте.

Ответ №1:

В событии нажатия клавиш текстового поля:

         string keys = "";

        if ((Keyboard.Modifiers amp; ModifierKeys.Control) > 0)
        {
            keys  = "Control   ";
        }

        if ((Keyboard.Modifiers amp; ModifierKeys.Alt) > 0)
        {
            keys  = "Alt   ";
        }

        if ((Keyboard.Modifiers amp; ModifierKeys.Shift) > 0)
        {
            keys  = "Shift   ";
        }

        keys  = e.Key;

        YourTextBox.Text = keys;
  

Комментарии:

1. Спасибо, это работает, но если я нажимаю «Alt AnyKey», выводится «Alt System», а не «Alt F». Как исправить это поведение?

2. Взгляните на здесь вы найдете свой ответ.

Ответ №2:

Я не знаю более быстрого способа, чем то, что показывает Navid (проверяйте каждый модификатор по отдельности).

Кроме того, нет встроенного типа, который объединяет клавишу и клавиатуру.Модификаторы уже есть, поэтому вам придется создать свои собственные, подобные этому:

 public class KeyboardStatus
{
    public KeyboardStatus(Key key, ModifierKeys modifiers)
    {
        _modifiers = modifiers;
    }

    public Key PressedKey { get; set; }
    public bool IsControlPressed { get { return ((_modifiers amp; ModifierKeys.Control) > 0); } }
    // ....

    public override string ToString()
    {
        string display = string.Empty;

        display  = ((Keyboard.Modifiers amp; ModifierKeys.Control) > 0) ? "Ctrl   " : string.Empty;
        display  = ((Keyboard.Modifiers amp; ModifierKeys.Alt) > 0) ? "Alt   " : string.Empty;
        display  = ((Keyboard.Modifiers amp; ModifierKeys.Shift) > 0) ? "Shift   " : string.Empty;
        display  = ((Keyboard.Modifiers amp; ModifierKeys.Windows) > 0) ? "Win   " : string.Empty;
        display  = PressedKey.ToString();
        return display;
    }
    ModifierKeys _modifiers;
}
  

Комментарии:

1. Спасибо, это работает, но если я нажимаю «Alt AnyKey», выводится «Alt System», а не «Alt F». Как исправить это поведение?

2. Может ли быть так, что строка display = Key. toString() на самом деле использует Key в качестве типа, а не Key для локального свойства? Попробуйте переименовать свойство в PressedKey (или какое-либо другое незащищенное имя). Я изменю пример.