【问题标题】:How to detect key press with only single Alt modifier如何仅使用单个 Alt 修饰符检测按键
【发布时间】:2017-11-09 15:37:23
【问题描述】:

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

例如:
当我按下 Shift:_______ 时,我不想输出任何内容。
当我按 Shift+A:_____ 时,我想输出“Shift A”。
当我按 Shift+Alt+A:__ 我想输出“Shift+Alt A”
当我按 Alt+A:_______ 我想输出“Alt A”

但是,“Alt A”不显示,因为如果不按下 Shift/Ctrl,则无法使用 Keyboard.IsKeyDown 检测到 Alt 键按下

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

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”?



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

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

【问题讨论】:

  • 您使用的是 MVVM 模式吗?您可以使用 bin 命令来输入手势,而无需担心这些代码背后的麻烦。
  • 我正要提到检查 Alt + A(特别是 A)所需要做的就是 if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt) ) && e.SystemKey == Key.A)
  • 虽然可能是这种情况,但我不得不在后面的代码中执行此操作,因为单击按钮会导致正确的行为,而 mvvm xaml 键绑定会导致不同的行为,所以我有当用户使用热键与单击按钮时,拦截其他地方的键并执行其他操作。有时无法解决,尤其是在处理 3rd 方组件时。

标签: c# wpf keyboard


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但即使使用您的代码“Alt A”也不起作用。当我按住 Ctrl+Alt、Shift+Alt 或 Shift+Ctrl+Alt 时,它会给我结果,但 Alt+A 没有。似乎当我只按住 Alt 键时,KeyEventAgrs 不会给 e.key 非修饰键检测的结果。
  • 当我按 Alt + 任何非修饰键时,它会给出“Alt + System”。当我在运行调试模式时按 Alt + 任意键时,我听到 Windows 系统发出“Tin!”的声音。也许非英语 Windows 或 IME 会出现这种行为?我正在使用美国布局键盘,刚刚切换到 EN IME,但行为是一样的......
  • @chihirobelmo 我再次更新了代码以获得正确的密钥。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多