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。我认为解决此问题的唯一方法是在您的程序中使用美国布局。但是,这可能会导致其他几个问题,具体取决于您在做什么。