Как использовать несколько клавиш-модификаторов в C # - PullRequest
22 голосов
/ 16 сентября 2009

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

if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control && e.Modifiers == Keys.Shift)
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}

Почему-то комбинация клавиш, в которой я нажимаю Ctrl + Shift + C , не работает. Я переупорядочил их и разместил наверху, думая, что это может быть помехой от Ctrl + C , и даже удалил Ctrl + C чтобы узнать, не вызывает ли это проблемы. Это все еще не работает. Я знаю, что это, наверное, что-то очень простое, но не могу понять, что это такое. Все мои 1 комбинация модификаторов + 1 клавиш работают нормально, как только я добавляю второй модификатор, когда он больше не работает.

Ответы [ 8 ]

41 голосов
/ 16 сентября 2009
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}
7 голосов
/ 16 сентября 2009

Вы пробовали e.Modifiers == (Keys.Control | Keys.Shift)?

6 голосов
/ 16 сентября 2009

Если вы хотите разрешить Ctrl и Shift , тогда используйте побитовое ИЛИ (поскольку Keys - это Flags enum)

if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work (if Ctrl-Shift-C is pressed, but not if Alt is pressed as well)
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste (if Ctrl is only modifier pressed)
}

Это не удастся, если нажата Alt

2 голосов
/ 20 октября 2014
      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();
2 голосов
/ 16 сентября 2009

Другим способом было бы добавить невидимый элемент меню, назначить ему ярлык Ctrl + Shift + C и обработать событие там.

1 голос
/ 09 октября 2014

Это то, что я сделал для Ctrl + Z Отмена и Ctrl + Shift + Z Повторите операцию, и она сработала.

  Private Sub Form_Main_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
      Case Keys.Add
        diagramView.ZoomIn()
      Case Keys.Subtract
        diagramView.ZoomOut()
      Case Keys.Z
        If e.Modifiers = Keys.Control + Keys.Shift Then
          diagram.UndoManager.Redo()
        ElseIf e.Modifiers = Keys.Control Then
          diagram.UndoManager.Undo()
        End If
    End Select
  End Sub
0 голосов
/ 28 сентября 2017

Поскольку никто больше не упоминает их, я просто оставлю предложение использовать KeyEventArgs.KeyData:

if (e.KeyData == (Keys.C | Keys.Control | Keys.Shift)
{
  //do stuff
  //potentially use e.Handled = true
}
if (e.KeyData == (Keys.V | Keys.Control)
{
  //do other stuff
  //potentially use e.Handled = true
}

Это должно действовать только на определенные комбинации клавиш, хотя порядок модификаторов, кажется, не имеет значения, первая всегда является последней нажатой клавишей.

И e.Handled = true должно остановить это, хотя я не знаю, какая именно механика стоит за этим.

0 голосов
/ 16 сентября 2009

Попробуй это. Должен вести себя так, как вы хотите, и это немного проще.

 if (e.Control)
 {
    if (e.Shift && e.KeyCode == Keys.C)
    {
       //Do work
    }
    else if (e.KeyCode == Keys.V)
    {
       //Paste
    }
 }
...