wake-up-neo.net

Jak používat více kláves modifikátoru v jazyce C #

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.

22
jsmith
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}
41
Rom

Haben Sie e.Modifiers == (Keys.Control | Keys.Shift) ausprobiert?

7
Chris J

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

6
JDunkerley

Jiným způsobem bylo přidat neviditelnou položku menu, přiřaditCtrl+Shift+Cna něj a zpracovat událost tam.

2
Druid
      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();
2
Stephane Ehret

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
1
Chris

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
    }
 }
0
Donut

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.

0
Martin