Question

J'utilise un événement keydown pour détecter les touches enfoncées et disposer de plusieurs combinaisons de touches pour différentes 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 appuyé sur Ctrl + Maj + C ne fonctionne pas. Je les ai commandés de nouveau et je les ai placés en haut, pensant que c’était peut-être une interférence de Ctrl + C , et même supprimé le Ctrl + C pour voir si cela posait un problème. Cela ne fonctionne toujours pas. Je sais que c'est probablement quelque chose de très simple, mais je ne peux pas bien comprendre ce que c'est. Toutes mes combinaisons de 1 modificateur + 1 combinaison fonctionnent correctement, dès que j'ajoute un deuxième modificateur, c'est quand elle ne fonctionne plus.

Était-ce utile?

La solution

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

Autres conseils

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

Si vous souhaitez autoriser Ctrl et Shift , utilisez l'OR au niveau du bit 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)
}

Cela échouera si Alt est également enfoncé

Vous pouvez également ajouter un élément de menu invisible, attribuer le raccourci Ctrl + Maj + C et gérer l'événement. là-bas.

      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();

C’est ce que j’ai fait pour un Ctrl + Z Annuler et Ctrl + Maj + Z Refaire l'opération et ça a fonctionné.

  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

Essayez ceci. Devrait se comporter comme vous le souhaitez, 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
    }
 }

Comme personne ne les mentionne, je vais simplement 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
}

Ceci ne devrait agir que sur des combinaisons de touches spécifiques, bien que l'ordre des modificateurs ne semble pas avoir d'importance, le premier est toujours la dernière touche enfoncée.

Et e.Handled = true devrait l'arrêter, bien que je ne connaisse pas les mécanismes spécifiques derrière cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top