4

我希望能够知道何时按下或释放修改的键(Ctrl或)。Shift

基本上,用户可以在按下修改键的情况下执行多次击键,并且我不想在它被释放之前执行一个动作(想想带有+ +的Emacs)。CtrlXS

我试图用 PreviewKeyUp 和 PreviewKeyDown 来做到这一点,但这似乎处理普通键而不是修饰符。一旦我在事件中,我可以判断修改键是否被按下,但我无法判断修改键是否被释放并在事件之间重新按下。

4

4 回答 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))
        {
            ....
        }
于 2012-04-27T15:42:05.473 回答
1

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

于 2012-04-27T15:39:08.430 回答
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;
}
于 2012-04-27T15:47:45.007 回答
0

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

这里我只是举一个Shift+的例子A

if (e.Key == Key.A && Keyboard.Modifiers == ModifierKeys.Shift)
{
    // Do something.
}
于 2013-01-02T13:07:46.233 回答