2009-09-16 5 views
19

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

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 + Сдвиг + C не работает. Я снова заказал их, и поставил его на первое место, думая, что может быть помехи от Ctrl + C, и даже Убрана Ctrl + C, чтобы увидеть, если он вызывает проблему. Это все еще не работает. Я знаю, что это, наверное, что-то очень простое, но не может понять, что это такое. Все мои 1 модификатор + 1 комбинация клавиш отлично работают, как только я добавляю второй модификатор, когда он больше не работает.

ответ

39
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

Вы пытались e.Modifiers == (Keys.Control | Keys.Shift)?

0

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

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

Если вы хотите, чтобы Ctrl и сдвиг затем использовать побитовое ИЛИ (как Keys является Flags перечисление)

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

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

1

Это то, что я сделал для Ctrl + Z отмен и Ctrl + Сдвиг + Z операции Redo, и она работала.

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 
2
 if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0) 
      Debugger.Launch(); 
0

Видя, как никто не упоминает о них, я буду просто оставить предложение использовать 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 должен прекратить его, хотя я не знаю конкретных механизмов, стоящих за ним.