【发布时间】:2017-11-09 15:37:23
【问题描述】:
我想仅在按下非修饰键时检测按键事件。 然后我也想知道同时按下了哪些修饰键。
例如:
当我按下 Shift:_______ 时,我不想输出任何内容。
当我按 Shift+A:_____ 时,我想输出“Shift A”。
当我按 Shift+Alt+A:__ 我想输出“Shift+Alt A”
当我按 Alt+A:_______ 我想输出“Alt A”
但是,“Alt A”不显示,因为如果不按下 Shift/Ctrl,则无法使用 Keyboard.IsKeyDown 检测到 Alt 键按下
以下是我的测试代码的一部分。
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”?
编辑:谢谢,伙计们的帮助。我编辑了最后一个 if 语句,它像这样检查 Key.System,它就像我想要的那样工作。
if (e.Key == Key.System)
{
key = e.SystemKey;
if (e.SystemKey.HasFlag(Key.LeftAlt) | e.SystemKey.HasFlag(Key.RightAlt))
return;
Label_Test.Content = "Alt";
}
【问题讨论】:
-
您使用的是 MVVM 模式吗?您可以使用 bin 命令来输入手势,而无需担心这些代码背后的麻烦。
-
我正要提到检查 Alt + A(特别是 A)所需要做的就是 if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt) ) && e.SystemKey == Key.A)
-
虽然可能是这种情况,但我不得不在后面的代码中执行此操作,因为单击按钮会导致正确的行为,而 mvvm xaml 键绑定会导致不同的行为,所以我有当用户使用热键与单击按钮时,拦截其他地方的键并执行其他操作。有时无法解决,尤其是在处理 3rd 方组件时。