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

Coo*_*Bro 6 c# wpf events

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

if(Keyboard.IsKeyDown(specificKey)){

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

BRA*_*mel 24

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

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

  • 刚刚进入你的帖子,你的例子是最简单/最干净的解决方案.我会重构一些丑陋的代码.谢谢. (7认同)

Lad*_*gic 5

重构您的代码:XAML: <TextBox Text="text" LostFocus="TextBox_LostFocus" KeyDown="TextBox_KeyDown" KeyUp="TextBox_KeyUp"/>

代码隐藏:

List<Key> _pressedKeys = new List<Key>();


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();
}
Run Code Online (Sandbox Code Playgroud)