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

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

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

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

如果你想允许CtrlShift然后使用按位OR(因为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也会失败

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

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

这是我为Ctrl + Z Undo和Ctrl + Shift + Z Redo操作所做的,它起作用了。

  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 

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

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

看到没有人提到他们,我只是要留下使用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应该阻止它,虽然我不知道它背后的具体机制。