27

我正在使用 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 组合键都可以正常工作,只要我添加了第二个修饰符,它就不再起作用了。

4

8 回答 8

46
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}
于 2009-09-16T19:04:29.017 回答
9

你试过e.Modifiers == (Keys.Control | Keys.Shift)吗?

于 2009-09-16T19:04:37.690 回答
6

如果你想允许Ctrl然后Shift使用按位或(作为Keys枚举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)
}

Alt如果也被按下,这将失败

于 2009-09-16T19:07:38.617 回答
2

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

于 2009-09-16T19:08:04.950 回答
2
      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();
于 2014-10-20T13:23:46.020 回答
1

这就是我为Ctrl+ ZUndo 和Ctrl+ Shift+ ZRedo 操作所做的,它奏效了。

  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
于 2014-10-08T21:35:31.010 回答
0

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

 if (e.Control)
 {
    if (e.Shift && e.KeyCode == Keys.C)
    {
       //Do work
    }
    else if (e.KeyCode == Keys.V)
    {
       //Paste
    }
 }
于 2009-09-16T19:04:59.293 回答
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 应该阻止它,尽管我不知道它背后的具体机制。

于 2017-09-28T11:08:36.540 回答