我想仅在按下非修改键时才检测到按键事件。 然后我也想知道同时按下了哪些修改键。
例如:
当我按Shift键时:_______我想什么都不输出
当我按Shift + A:_____我想输出" Shift A"。
当我按Shift + Alt + A:__时,我想输出" Shift + Alt A"
当我按Alt + A:_______时,我想输出" Alt A"
然而," Alt A"没有显示,因为没有按住Shift / Ctrl键,Alt键不能用Keyboard.IsKeyDown检测到
以下是我的测试代码的一部分。
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"?
编辑:谢谢,伙计们的帮助。我编辑了最后一个检查Key.System的if语句,它就像我想要的那样工作。
if (e.Key == Key.System)
{
key = e.SystemKey;
if (e.SystemKey.HasFlag(Key.LeftAlt) | e.SystemKey.HasFlag(Key.RightAlt))
return;
Label_Test.Content = "Alt";
}
答案 0 :(得分:2)
检查是否仅按下修饰符将e.Key
与所有修饰键进行比较,并在这种情况下返回空字符串。
如果e.Key
不是修饰键,那么我们需要将其与当前按下的修饰符一起打印。要获取这些修饰符,只需遍历除ModifierKeys
之外的None
枚举的所有值,并为HasFlag
上的每个值调用Keyboard.Modifiers
。
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 }));
}