如何判断修改键何时被按下/释放

如何判断修改键何时被按下/释放

问题描述:

我希望能够判断何时按下或释放了修改键(CNTRL或SHIFT)。基本上,用户可以按下一个修饰键来执行多个按键操作,我不想在操作被释放之前执行一个操作(想想带有CNTRL + X + S的emacs)。我试图用PreviewKeyUp和PreviewKeyDown做到这一点,但似乎处理普通的键而不是修饰符。我可以判断一旦我处于事件中时是否按下了修饰键,但我不知道修饰键是否在事件之间释放并重新按下。如何判断修改键何时被按下/释放

刚刚意识到存在Key.LeftShift等。因此,我可以在按下时设置一个标志,并在释放按键时检查该标志。

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    //just picked that key for a sample 
     case Key.Tab: 
      if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) 
      DoMyStuff(); 

     ///similar things for Ctrl 
     if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) 
      ..... 

最简单的方法就是这样做,只要你想得到哪些修饰符被按下。

var kb = new Microsoft.VisualBasic.Devices.Keyboard(); 

var alt = kb.AltKeyDown; 
var ctrl = kb.CtrlKeyDown; 
var shift = kb.ShiftKeyDown; 

你可以做一个方法了吧,所以这将是更容易使用,就像这样:

using Microsoft.VisualBasic.Devices; 

... 

private static readonly Keyboard KEYBOARD = new Keyboard(); 

private static Keys GetPressedModifiers() 
{ 
    var mods = Keys.None; 

    if (KEYBOARD.AltKeyDown) 
    { 
     mods |= Keys.Alt; 
    } 

    if (KEYBOARD.CtrlKeyDown) 
    { 
     mods |= Keys.Control; 
    } 

    if (KEYBOARD.ShiftKeyDown) 
    { 
     mods |= Keys.Shift; 
    } 

    return mods; 
} 

你可以做在KeyDown或PreviewKeyDown事件是这样的。

//这里我只是把移位的示例+ A
如果(e.Key == Key.A & & Keyboard.Modifiers == ModifierKeys.Shift)
{
       // 做一点事。
}