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

4

我希望能够判断修改键(CtrlShift)何时被按下或释放。

基本上,用户可以在按下修饰键的情况下执行多个击键操作,而我不想在释放之前执行任何操作(类似于 Emacs 中的 Ctrl + X + S 操作)。

我曾试图使用 PreviewKeyUp 和 PreviewKeyDown 来实现此功能,但它似乎只处理普通键而不是修饰键。一旦进入事件,我就可以判断修改键是否被按下,但我无法判断修改键是否在事件之间被释放并重新按下。

4个回答

2
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
    // I 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
我刚刚意识到 Key.LeftShift 等存在。所以当按下它时,我可以设置一个标志并在释放键时检查该标志。

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

0
你可以在KeyDown或PreviewKeyDown事件中做类似这样的事情。
这里我只是举了一个Shift + A的例子:
if (e.Key == Key.A && Keyboard.Modifiers == ModifierKeys.Shift)
{
    // Do something.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接