如何区分wpf / c中的多个组合键#

时间:2014-10-01 08:51:46

标签: c# wpf keyboard key

我的键组合有问题。我会模拟所有键盘功能,但我不能区分一个修饰符+键和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");

    }
}

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

1 个答案:

答案 0 :(得分:2)

    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可能会提供modifierCollection。 (我没有检查,因为我不知道你正在使用哪个事件)。如果是这样,你应该使用那个而不是“Keyboard.PrimaryDevice.Modifiers”。

在尝试了一些事情之后,我注意到它在我的计算机上也不起作用,如果我在KeyDown Eventhandler和e.KeyboardDevice属性中使用它。原因是,eventHandler会考虑您的键盘布局。由于非US布局没有右Alt(Alt GR被Windows注册为“ALT + LEFT CTRL”),因此这将永远不会起作用。我尝试将我的布局更改为英语 - 美国,它运作得很好。

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

    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。我认为解决这个问题的唯一方法是在你的程序中使用US Layout。然而,这可能会导致其他一些问题,具体取决于您正在做什么。