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