Wie mehrere Zusatztasten in C # verwenden,
-
07-07-2019 - |
Frage
Ich bin ein keydown Ereignis mit den Tasten gedrückt zu erkennen und haben mehrere Tastenkombinationen für verschiedene Operationen.
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
}
Aus irgendeinem Grund die Tastenkombination in dem ich getroffen Strg + Umschalttaste + C funktioniert nicht. Ich habe wieder bestellt sie und legte sie an der Spitze denken es zu Störungen kommen könnte aus dem Strg + C und sogar entfernt die Strg + C , um zu sehen, ob es ein Problem verursacht wurde. Es funktioniert immer noch nicht. Ich weiß, es ist wahrscheinlich etwas sehr einfach, kann aber nicht ganz begreifen, was es ist. Alle Arbeiten in Ordnung ist meiner 1 Modifikator + 1 Tastenkombination, sobald ich eine zweite Modifikator hinzuzufügen ist, wenn es nicht mehr funktioniert.
Lösung
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
Andere Tipps
Haben Sie versucht, e.Modifiers == (Keys.Control | Keys.Shift)
?
Wenn Sie zulassen möchten Strg und Umschalttaste dann das bitweise verwenden OR (als Keys
ein Flags
Enum ist)
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)
}
Dies wird fehlschlagen, wenn Alt wird auch gedrückt
Eine andere Möglichkeit wäre eine unsichtbare Menüpunkt hinzufügen, weisen Sie die Strg + Umschalttaste + C Verknüpfung zu ihm, und behandeln das Ereignis es.
if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
Debugger.Launch();
Das ist, was ich tat für eine Strg + Z Rückgängig und Strg + Umschalttaste + Z Wiederherstellen Betrieb und es hat funktioniert.
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
Versuchen Sie dies. Sollte so verhalten, wie Sie es haben wollen, und es ist ein wenig einfacher.
if (e.Control)
{
if (e.Shift && e.KeyCode == Keys.C)
{
//Do work
}
else if (e.KeyCode == Keys.V)
{
//Paste
}
}
Sehen als sonst niemand sie erwähnt, ich werde einfach den Vorschlag verlassen KeyEventArgs.KeyData zu verwenden:
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
}
Dies sollte nur auf bestimmte Tastenkombinationen wirkt, obwohl die Reihenfolge der Modifikatoren sind nicht wichtig erscheint, ist die erste, immer die zuletzt gedrückte Taste.
Und e.Handled = true sollte es stoppen, obwohl ich weiß nicht, die spezifische Mechanik dahinter.