如何在wpf中检测多个键onkeydown事件?

我不想检测任何双键组合,所以解决方案就像

if(Keyboard.IsKeyDown(specificKey)){ } 

不会工作,除非当然,我会检查每一个关键状态,我希望我不必这样做。 。

  private void TextBox_KeyDown_1(object sender, KeyEventArgs e) { Console.WriteLine(combination of keys pressed); } 

编辑:最终目标是检测任何(不是特定组合/单键)组合键。

EDIT2:LadderLogic的解决方案非常有效。

重构您的代码:XAML:

后台代码:

 List _pressedKeys = new List(); private void TextBox_KeyDown(object sender, KeyEventArgs e) { if (_pressedKeys.Contains(e.Key)) return; _pressedKeys.Add(e.Key); PrintKeys(); e.Handled = true; } private void TextBox_KeyUp(object sender, KeyEventArgs e) { _pressedKeys.Remove(e.Key); PrintKeys(); e.Handled = true; } private void PrintKeys() { StringBuilder b = new StringBuilder(); b.Append("Combination: "); foreach (Key key in _pressedKeys) { b.Append(key.ToString()); b.Append("+"); } b.Length--; Console.WriteLine(b.ToString()); } private void TextBox_LostFocus(object sender, RoutedEventArgs e) { _pressedKeys.Clear(); } 

您应该将键修饰符与自定义键结合使用

 if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) // Is Alt key pressed { if (Keyboard.IsKeyDown(Key.S) && Keyboard.IsKeyDown(Key.C)) { // do something here } } 

这是经过测试和运行的解决方案,有多项改进。 我用它来制作一个文本框,读取输入组合,以便以后用作热键。

function: AllowedKeysMaxKeyCountModifierKeys检查。 如果不需要,可以删除它们中的每一个。

XAML:

      

代码隐藏:

 ///  /// Interaction logic for KeyTestWindow.xaml ///  public partial class KeyTestWindow : Window { int MaxKeyCount = 3; List PressedKeys = new List(); List AllowedKeys = new List(); public KeyTestWindow() { InitializeComponent(); tbHotkeys.Focus(); //Init the allowed keys list AllowedKeys.Add(Key.LeftCtrl); AllowedKeys.Add(Key.A); AllowedKeys.Add(Key.B); AllowedKeys.Add(Key.LeftShift); } private void TextBox_KeyDown(object sender, KeyEventArgs e) { if (e.Handled) return; //Check all previous keys to see if they are still pressed List KeysToRemove = new List(); foreach (Key k in PressedKeys) { if (!Keyboard.IsKeyDown(k)) KeysToRemove.Add(k); } //Remove all not pressed keys foreach (Key k in KeysToRemove) PressedKeys.Remove(k); //Add the key if max count is not reached if (PressedKeys.Count < MaxKeyCount) //Add the key if it is part of the allowed keys //if (AllowedKeys.Contains(e.Key)) if (!PressedKeys.Contains(e.Key)) PressedKeys.Add(e.Key); PrintKeys(); e.Handled = true; } private void PrintKeys() { //Print all pressed keys string s = ""; if (PressedKeys.Count == 0) return; foreach (Key k in PressedKeys) if (IsModifierKey(k)) s += GetModifierKey(k) + " + "; else s += k + " + "; s = s.Substring(0, s.Length - 3); tbHotkeys.Text = s; } private bool IsModifierKey(Key k) { if (k == Key.LeftCtrl || k == Key.RightCtrl || k == Key.LeftShift || k == Key.RightShift || k == Key.LeftAlt || k == Key.RightAlt || k == Key.LWin || k == Key.RWin) return true; else return false; } private ModifierKeys GetModifierKey(Key k) { if (k == Key.LeftCtrl || k == Key.RightCtrl) return ModifierKeys.Control; if (k == Key.LeftShift || k == Key.RightShift) return ModifierKeys.Shift; if (k == Key.LeftAlt || k == Key.RightAlt) return ModifierKeys.Alt; if (k == Key.LWin || k == Key.RWin) return ModifierKeys.Windows; return ModifierKeys.None; } }