Používám událost keydown und detekci stisknutých kláves a mám několik klávesových kombinací pro různé operace.
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
}
Z nějakého důvodu je klíčová kombinace, do které jsem narazilCtrl+Shift+Cnení funkční. Znovu jsem si je objednal a postavil jsem ho na vrchol, který by mohl být rušenímCtrl+Cein dokonce odstranilCtrl+Czjistit, zda to způsobuje problém. Stále to nefunguje. Vím, že je to asi něco velmi jednoduchého, ale nedokážu pochopit, co to je. Všechny mé 1 modifikátor + 1 kombinace kláves funguje dobře, jakmile přidám druhý modifikátor, když už nefunguje.
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
Haben Sie e.Modifiers == (Keys.Control | Keys.Shift)
ausprobiert?
Pokud chcete povolitCtrleinShiftpak použijte bitovou OR (jako Keys
je 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)
}
Zu se nezdaří, pokudAltje také stisknuto
Jiným způsobem bylo přidat neviditelnou položku menu, přiřaditCtrl+Shift+Cna něj a zpracovat událost tam.
if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
Debugger.Launch();
Um es zu tun, co jsem udělal proCtrl+ZZpět aCtrl+Shift+ZZnovu operaci a to fungovalo.
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
Versuche dies. Sollte sich so verhalten, wie Sie es möchten, und es ist ein bisschen einfacher.
if (e.Control)
{
if (e.Shift && e.KeyCode == Keys.C)
{
//Do work
}
else if (e.KeyCode == Keys.V)
{
//Paste
}
}
Da niemand sonst sie erwähnt, lasse ich nur den Vorschlag, 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 für bestimmte Tastenkombinationen gelten, obwohl die Reihenfolge der Modifikatoren keine Rolle zu spielen scheint. Die erste ist immer die zuletzt gedrückte Taste.
Und e.Handled = true sollte aufhören, obwohl ich die spezifischen Mechanismen dahinter nicht kenne.