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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top