Comment utiliser plusieurs touches de modification en C #
-
07-07-2019 - |
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.
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.