2009-09-16 58 views
19

我正在使用keydown事件来检测按下的按键,并有多种操作的组合键。如何在C#中使用多个修饰键?

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 ++ç不工作。我已经重新命令他们,并把它放在顶部认为它可能是从按Ctrl +Ç干扰,甚至删除按Ctrl +Ç,看它是否是导致问题。它仍然不起作用。我知道这可能很简单,但不能完全掌握它的内容。当我添加第二个修饰符时,我所有的1修饰符+ 1组合键都无法正常工作。

回答

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

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

0

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

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

如果你想允许按Ctrl然后使用按位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键按下以及这会失败

2

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

1

这是我做的按Ctrl +ž撤消按Ctrl ++ž重做操作和它的工作。

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 
2
 if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0) 
      Debugger.Launch(); 
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应该停止它,但我不知道它背后的具体机制。

相关问题