Domanda

Sto usando un evento keydown per rilevare i tasti premuti e ho diverse combinazioni di tasti per varie operazioni.

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
}

Per qualche ragione la combinazione di tasti in cui ho premuto Ctrl + Maiusc + C non funziona. Li ho riordinati e l'ho posizionato in alto pensando che potrebbe essere un'interferenza dal Ctrl + C e ho persino rimosso il Ctrl + C per vedere se stava causando un problema. Non funziona ancora. So che probabilmente è qualcosa di molto semplice, ma non riesco a capire cosa sia. Tutti i miei 1 modificatore + 1 combinazione di tasti funzionano bene, non appena aggiungo un secondo modificatore è quando non funziona più.

È stato utile?

Soluzione

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

Altri suggerimenti

Hai provato e.Modifiers == (Keys.Control | Keys.Shift) ?

Se si desidera consentire Ctrl e Maiusc , utilizzare OR bit per bit (poiché Keys è 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)
}

Questo fallirà se si preme Alt

Un altro modo sarebbe quello di aggiungere una voce di menu invisibile, assegnare il collegamento Ctrl + Maiusc + C e gestire l'evento lì.

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

Questo è quello che ho fatto per Ctrl + Z Annulla e Ctrl + Maiusc + Z Ripeti l'operazione e ha funzionato.

  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

Prova questo. Dovrebbe comportarsi nel modo desiderato, ed è un po 'più semplice.

 if (e.Control)
 {
    if (e.Shift && e.KeyCode == Keys.C)
    {
       //Do work
    }
    else if (e.KeyCode == Keys.V)
    {
       //Paste
    }
 }

Visto che nessun altro li menziona, ho intenzione di lasciare il suggerimento di utilizzare 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
}

Questo dovrebbe agire solo su specifiche combinazioni di tasti, anche se l'ordine dei modificatori non sembra avere importanza, il primo è sempre l'ultimo tasto premuto.

Ed e.Handled = true dovrebbe fermarlo, anche se non conosco la meccanica specifica dietro di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top