Comment utiliser plusieurs touches de modificateur dans C#

j'utilise un événement keydown pour détecter les touches pressées et j'ai plusieurs combinaisons de touches pour diverses opérations.

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
}

Pour une raison quelconque, la combinaison de touches dans laquelle j'ai frappé Ctrl+ Maj+ C ne fonctionne pas. Je les ai commandés, et les ai placés en haut en pensant qu'il pourrait y avoir des interférences de la Ctrl+ C, et même enlevé le Ctrl+ C pour voir si elle était à l'origine problème. Il ne fonctionne toujours pas. Je sais que c'est probablement quelque chose de très simple, mais je n'arrive pas à comprendre ce que c'est. Tout mon 1 modificateur + 1 combinaison de touches fonctionne bien, dès que j'ajoute un deuxième modificateur est quand il ne fonctionne plus.

22
demandé sur jsmith 2009-09-16 23:00:07

8 réponses

if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}
40
répondu Rom 2009-09-16 19:04:29

Avez-vous essayé e.Modifiers == (Keys.Control | Keys.Shift)?

7
répondu Chris J 2012-10-31 19:16:54

Si vous souhaitez autoriser Ctrl et Maj puis utilisez le bitwise ou (comme Keys est un 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)
}

Ce sera un échec si Alt est pressé ainsi

6
répondu JDunkerley 2011-09-11 10:40:58

une autre façon serait d'ajouter un élément de menu invisible, assignez le Ctrl+ Maj+ C raccourci, et de gérer l'événement.

2
répondu Druid 2011-09-11 10:41:01
      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();
2
répondu Stephane Ehret 2014-10-20 13:23:46

c'est Ce que j'ai fait pour un Ctrl+Z Annuler Ctrl+Maj+Z opération Redo et ça a marché.

  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
1
répondu Chris 2014-11-18 19:21:49

Essayez ceci. On devrait se comporter comme on veut, et c'est un peu plus simple.

 if (e.Control)
 {
    if (e.Shift && e.KeyCode == Keys.C)
    {
       //Do work
    }
    else if (e.KeyCode == Keys.V)
    {
       //Paste
    }
 }
0
répondu Donut 2009-09-16 19:04:59

Voyant que personne ne le mentionne, je vais juste laisser la suggestion d'utiliser 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
}

cela ne devrait agir que sur des combinaisons de touches spécifiques, bien que l'ordre des modificateurs ne semble pas avoir d'importance, la première étant toujours la dernière touche pressée.

et E. Handled = true devrait l'arrêter, bien que je ne connaisse pas la mécanique spécifique derrière elle.

0
répondu Martin 2017-09-28 11:08:36