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

时间:2012-04-27 15:35:26

标签: c# wpf events modifier-key

我希望能够分辨出何时按下或释放修改后的键(CNTRL或SHIFT)。基本上用户可以在按下修改键的情况下执行多次击键,我不想在发布之后执行操作(想想使用CNTRL + X + S的emacs)。我试图用PreviewKeyUp和PreviewKeyDown来做这个,但这似乎处理普通键而不是修饰符。我在事件中可以判断是否按下了修改键,但是我无法判断修改键是否在事件之间被释放并重新按下。

4 个答案:

答案 0 :(得分:2)

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))
            .....

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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;
}

答案 3 :(得分:0)

您可以在KeyDown或PreviewKeydown事件中执行类似的操作。

//这里我只是举一个Shift + A的例子 if(e.Key == Key.A&& Keyboard.Modifiers == ModifierKeys.Shift)
{
 //做点什么 }