Подтвердить что ты не робот

Как создать сложные сочетания клавиш в приложении Windows Forms?

Я хочу создать компонент, который позволяет нам создавать сложные сочетания клавиш, связанные с произвольной командой, например Visual Studio IDE и Microsoft Office.

То есть сочетания клавиш, состоящие из последовательности нескольких нажатий клавиш, таких как Ctrl + W + C. В Visual Studio открывается класс. Когда нажимается первый набор клавиш (Ctrl + W), нажимается сообщение "(Ctrl + W). Ожидание второго ключа аккорда..." отображается в строке состояния.

4b9b3361

Ответ 1

В ответ на вопрос о аккордах клавиатуры, я не думаю, что на данный момент есть готовый вариант.

Однако он должен быть достаточно прост, чтобы моделировать. Я бы создал один класс, возможно, KeyboardChordProvider. Он должен будет знать о событиях клавиатуры на уровне формы. Как указано в другом месте, свойство Form.KeyPreview должно быть true. Для этого провайдера может быть достаточно подписаться на событие Form.KeyPress. Вы можете сделать все это в конструкторе поставщика, если вы передали форму.

Вам нужно будет зарегистрировать потенциальные нажатия клавиш у поставщика.

Внутри этого экземпляра будет отслеживаться текущее состояние. Всякий раз, когда наблюдается нажатие клавиши, которое представляет первый ключ аккорда, вы должны обновить состояние поставщика и поднять событие, чтобы абонент мог установить текст: (CTRL + W) было нажато. Ожидание второго ключа аккорда...

Если следующее нажатие клавиши совпадает с потенциальной вторичной опцией, тогда вы получите совпадение и можете поднять событие ChordPressed, содержащее данные о введенных штрихах. В качестве альтернативы вы можете просто вызвать конкретный обратный вызов, который был предоставлен провайдеру во время регистрации аккорда (чтобы избежать использования оператора switch или какой-либо другой отправки в обработчике событий ChordPressed).

Если в любое время нажатие клавиши не соответствует потенциальной следующей опции, вы бы reset состояние поставщика.

Внутри провайдера вы можете моделировать возможные нажатия клавиш с использованием древовидной структуры. Текущее состояние поставщика - это просто дерево node. В начале будет активен корень node. Если ребенок соответствует нажатию клавиши, тогда он будет текущим node в ожидании следующего такта. Если дочерний элемент был листом node, то весь аккорд совпал, и вы поднимете событие ChordPressed (передавая цепочку штрихов, которые доставили вас к этой точке), или вызовите обратный вызов, сохраненный в листе. Всякий раз, когда никакое нажатие клавиши не соответствует ребенку, reset назад, чтобы сделать корень node активным.

Я думаю, что этот проект достигнет того, чего вы хотите.

Ответ 2

Элементы управления меню имеют свойство с именем ShortCut, где вы можете присвоить значение. Когда вы нажимаете эту клавишу быстрого доступа, этот пункт меню будет вызываться. Используйте это свойство для команд, имеющих соответствующее меню.

Если вам нужны ярлыки, которые не будут доступны в меню, вам придется обрабатывать это самостоятельно через KeyUp или KeyDown, либо в форме, либо в элементе управления. Объект KeyEventArgs будет передан вашему обработчику, и вы можете проверить, какая клавиша нажата, и будут ли клавиши Ctrl, Alt или Shift также были нажаты.

Пример кода из MSDN:

// Handle the KeyDown event to determine the type of character entered into the control.
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Initialize the flag to false.
    nonNumberEntered = false;

    // Determine whether the keystroke is a number from the top of the keyboard.
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
    {
        // Determine whether the keystroke is a number from the keypad.
        if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
        {
            // Determine whether the keystroke is a backspace.
            if(e.KeyCode != Keys.Back)
            {
                // A non-numerical keystroke was pressed.
                // Set the flag to true and evaluate in KeyPress event.
                nonNumberEntered = true;
            }
        }
    }
    //If shift key was pressed, it not a number.
    if (Control.ModifierKeys == Keys.Shift) {
        nonNumberEntered = true;
    }
}

Ответ 3

Используйте форму OnKeyPressed event и проверьте, была ли нажата желаемая комбинация клавиш в аргументе eventArgs

Ответ 4

В дополнение к некоторым ответам использование амперсанда в заголовке кнопки или элемента меню приведет к тому, что оно будет подчеркнуто и доступно с помощью Alt + буквы, которой предшествует амперсанд &.

Другими словами, если у вас есть пункт меню captioned & File, он будет отображаться с подчеркиванием под F, и пользователь может вызвать меню, нажав Alt + F.

Ответ 5

Это зависит от объема сочетания клавиш. Если вы хотите, чтобы комбинация клавиш использовалась из любого элемента управления в форме без использования панели инструментов, установите

Form.KeyPreview = true;

на форме. Это позволит всем событиям нажатия клавиш фильтроваться событиями KeyPress, KeyDown и KeyUp на уровне формы, которые позволят обрабатывать одну комбинацию клавиш в одном месте вместо дублирования функций во всех пользовательских элементах управления.

MSDN: Свойство Form.KeyPreview