如何使用单个Alt修饰符

时间:2017-06-08 04:59:05

标签: c# wpf keyboard

我想仅在按下非修改键时才检测到按键事件。 然后我也想知道同时按下了哪些修改键。

例如:
当我按Shift键时:_______我想什么都不输出 当我按Shift + A:_____我想输出" Shift A"。
当我按Shift + Alt + A:__时,我想输出" Shift + Alt A"
当我按Alt + A:_______时,我想输出" Alt A"

然而," Alt A"没有显示,因为没有按住Shift / Ctrl键,Alt键不能用Keyboard.IsKeyDown检测到

以下是我的测试代码的一部分。

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    Key key = e.Key;

    if (key.ToString().Contains("Ctrl") | key.ToString().Contains("Shift") | key.ToString().Contains("Alt"))
        return;

    Label_Test.Content = "";

    if (Keyboard.IsKeyDown(Key.LeftShift) | Keyboard.IsKeyDown(Key.RightShift))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Shift";
    }
    if (Keyboard.IsKeyDown(Key.LeftCtrl) | Keyboard.IsKeyDown(Key.RightCtrl))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Ctrl";
    }
    if (Keyboard.IsKeyDown(Key.LeftAlt) | Keyboard.IsKeyDown(Key.RightAlt))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Alt";
    }
    if (Keyboard.IsKeyDown(Key.System))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Alt";
    }
    if (Label_Test.Content.ToString() != "")
        Label_Test.Content += " ";
    Label_Test.Content += key.ToString();
}

我也试过

if (e.KeyboardDevice.Modifiers.ToString().Contains("Alt"))

但结果是一样的。 我怎么能检测到" Alt + A"?



编辑:谢谢,伙计们的帮助。我编辑了最后一个检查Key.System的if语句,它就像我想要的那样工作。

if (e.Key == Key.System)
{
    key = e.SystemKey;
    if (e.SystemKey.HasFlag(Key.LeftAlt) | e.SystemKey.HasFlag(Key.RightAlt))
        return;
    Label_Test.Content = "Alt";
}

1 个答案:

答案 0 :(得分:2)

检查是否仅按下修饰符将e.Key与所有修饰键进行比较,并在这种情况下返回空字符串。

如果e.Key不是修饰键,那么我们需要将其与当前按下的修饰符一起打印。要获取这些修饰符,只需遍历除ModifierKeys之外的None枚举的所有值,并为HasFlag上的每个值调用Keyboard.Modifiers

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    var modifierKeys = new[]
    {
        Key.LeftCtrl, Key.RightCtrl,
        Key.LeftAlt, Key.RightAlt,
        Key.LeftShift, Key.RightShift,
        Key.LWin, Key.RWin
    };

    var key = e.Key;
    if (key == Key.System)
        key = e.SystemKey;
    else if (key == Key.ImeProcessed)
        key = e.ImeProcessedKey;

    if (modifierKeys.Contains(key))
    {
        Label_Test.Content = string.Empty;
        return;
    }

    var modifiers = Keyboard.Modifiers;
    var modifiersPressed = Enum.GetValues(typeof(ModifierKeys))
                               .OfType<ModifierKeys>()
                               .Where(k => k != ModifierKeys.None && modifiers.HasFlag(k));

    Label_Test.Content = string.Join("+", modifiersPressed.OfType<object>()
                                                          .Concat(new object[] { key }));
}