Pergunta

Eu estou usando um evento keydown para detectar as teclas pressionadas e têm várias combinações de teclas para várias operações.

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
}

Por alguma razão a combinação de teclas em que eu bati Ctrl + Mudança + C não está funcionando. Tenho re ordenou-lhes, e colocou-o no topo pensando que poderia ser interferência do Ctrl + C , e até mesmo removido o Ctrl + C para ver se ele estava causando um problema. Ele ainda não funciona. Eu sei que é provavelmente algo muito simples, mas não consigo entender o que é. Toda a minha 1 modificador + 1 muito bem o trabalho de combinação de teclas, assim que eu adicionar um segundo modificador é quando funciona já não.

Foi útil?

Solução

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

Outras dicas

Você já tentou e.Modifiers == (Keys.Control | Keys.Shift)?

Se você quiser permitir Ctrl e Mudança , em seguida, usar o bit a bit OR (como Keys é um enum Flags)

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)
}

Isto irá falhar se Alt é pressionado assim

Outra forma seria para adicionar um item de menu invisível, atribuir o Ctrl + Mudança + C atalho para ele, e manipular o evento lá.

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

Isto é o que eu fiz para um Ctrl + Z Desfazer e Ctrl + Mudança + Z operação Redo e funcionou.

  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

Tente isto. Deve se comportar da maneira que você quer que ele, e é um pouco mais simples.

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

Já que ninguém menciona-los, eu só vou deixar a sugestão de usar 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
}

Isso só deve agir sobre combinações de teclas específicas, embora a ordem dos modificadores não parece importar, o primeiro é sempre a última tecla pressionada.

E e.Handled = true deve pará-lo, embora eu não sei a mecânica específicos por trás dele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top