【问题标题】:How to distinguish between multiple key combination in wpf/c#如何区分wpf/c中的多个组合键#
【发布时间】:2014-11-26 01:39:03
【问题描述】:

我对组合键有疑问。我会模拟所有键盘功能,但我无法区分一个修饰符+键和 2 个修饰符+键。

例如,如果我按 shift+ 键它可以工作,但如果我按 shift+altGR+ 键它不起作用,因为我的程序仅检测 altGR 即使我检查了是否按下了 shift

if(Keyboard.IsKeyDown(Key.RightAlt))
{
    if(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))    
    {
        Key key = e.Key;
        MessageBox.Show("Shift+AlgGr+key");

    }
    else
    {
        Key key = e.Key;
        MessageBox.Show("AlgGr+key");

    }
}

我该如何解决? 谢谢你的每一个想法。

【问题讨论】:

    标签: c# wpf keyboard key


    【解决方案1】:
        var sb = new StringBuilder();
        var modifierKeys = Keyboard.PrimaryDevice.Modifiers;
    
        if (modifierKeys.HasFlag(ModifierKeys.Alt))
            sb.Append("ALT ");
        if (modifierKeys.HasFlag(ModifierKeys.Control))
            sb.Append("CTRL ");
        if (modifierKeys.HasFlag(ModifierKeys.Shift))
            sb.Append("SHIFT ");
    
        Debug.Print(sb.ToString());
    

    这应该是你需要的。

    您可以使用以下方法检查特定键:

        var sb = new StringBuilder();
    
        if (Keyboard.PrimaryDevice.IsKeyDown(Key.RightAlt))
            sb.Append("RIGHT ALT ");
        if (Keyboard.PrimaryDevice.IsKeyDown(Key.LeftAlt))
            sb.Append("LEFT ALT ");
        if (Keyboard.PrimaryDevice.IsKeyDown(Key.LeftShift))
            sb.Append("LEFT SHIFT ");
        if (Keyboard.PrimaryDevice.IsKeyDown(Key.RightShift))
            sb.Append("RIGHT SHIFT ");
        if (Keyboard.PrimaryDevice.IsKeyDown(Key.LeftCtrl))
            sb.Append("LEFT CTRL ");
        if (Keyboard.PrimaryDevice.IsKeyDown(Key.RightCtrl))
            sb.Append("RIGHT CTRL ");
        Debug.Print(sb.ToString());
    

    在您的示例中,您使用的变量“e”似乎指向 EventArgs。如果是这种情况,e 可能会提供修饰符Collection。 (我没有检查,因为我不知道您使用的是哪个事件)。如果是这样,您应该使用那个而不是“Keyboard.PrimaryDevice.Modifiers”。

    在尝试了一些东西之后,我注意到如果我在 KeyDown 事件处理程序和 e.KeyboardDevice 属性中使用它,它在我的计算机上也不起作用。原因是 eventHandler 考虑了您的键盘布局。由于非美国布局没有右 Alt(Alt GR 被 Windows 注册为“ALT + LEFT CTRL”),这将永远无法工作。我尝试将我的 Layout 更改为 English-US 并且效果很好。

    简而言之:要检查 ALT-GR,您必须检查“ALT 修饰符 + CTRL 修饰符”。

        private void WindowKeyDown(object sender, KeyEventArgs e)
        {
            var alt = e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt);
            var ctrl = e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control);
            var altGr = alt & ctrl;
            var shift = e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Shift);
    
            if (altGr & shift)
                MessageBox.Show("Shift+AlgGr");
        }
    

    但是,“CTRL + ALT + SHIFT”和“ALT-GR + SHIFT”之间没有区别,因为真的没有区别。操作系统将 ALT-GR 报告为 ALT + CTRL。我认为解决此问题的唯一方法是在您的程序中使用美国布局。但是,这可能会导致其他几个问题,具体取决于您在做什么。

    【讨论】:

    • 对不起,它不起作用。这样我就无法检测到 alt 和 altGr 之间的区别。
    猜你喜欢
    • 2012-05-07
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多