我的键组合有问题。我会模拟所有键盘功能,但我不能区分一个修饰符+键和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");
}
}
我该如何解决? 谢谢你的每一个想法。
答案 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。然而,这可能会导致其他一些问题,具体取决于您正在做什么。