如何在C#中使用多个修饰键

时间:2009-09-16 19:00:07

标签: c# key keyboard-shortcuts keydown modifier-key

我正在使用keydown事件来检测按下的键,并为各种操作提供了几个键组合。

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
}

由于某种原因,我点击 Ctrl + Shift + C 的组合键不起作用。我重新订购了它们,并把它放在顶部,认为它可能是来自 Ctrl + C 的干扰,甚至删除了 Ctrl + C 以查看是否导致问题。它仍然无法正常工作。我知道它可能非常简单,但不能完全理解它是什么。我的所有1个修饰符+ 1个键组合都可以正常工作,只要我添加第二个修饰符就是它不再有效。

8 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:7)

您是否尝试过e.Modifiers == (Keys.Control | Keys.Shift)

答案 2 :(得分:6)

如果要允许 Ctrl Shift ,请使用按位OR(因为KeysFlags枚举)

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

如果同时按下 Alt

,则会失败

答案 3 :(得分:2)

另一种方法是添加一个不可见的菜单项,为它指定 Ctrl + Shift + C 快捷方式,并处理事件那里。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

这是我为 Ctrl + Z 撤消和 Ctrl + Shift + 所做的Z 重做操作并且有效。

  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

答案 6 :(得分:0)

试试这个。应该按照你想要的方式行事,而且有点简单。

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

答案 7 :(得分:0)

看到没有人提到他们,我只是要留下使用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
}

这应该只对特定的键组合起作用,虽然修饰符的顺序似乎并不重要,第一个始终是最后一个按键。

e.Handled = true应该阻止它,虽然我不知道它背后的具体机制。