这个问题让我筋疲力尽。
如果我按住 Ctrl 键并按任意键,程序会成功将其记录在WPF Window.KeyUp事件中并按预期执行:
private void Window_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.S && Keyboard.IsKeyDown(Key.LeftCtrl))
{
ButtonSave_Click(sender, null);
}
}
然后事情变得有趣。这仅适用于事件被触发的“第一次”。如果我继续按住左Ctrl并再次按 S ,则事件将在 LeftCtrl 的状态下启动(不是向下)。
因此,如果按住 Ctrl 键并多次按下 S 键,则ButtonSave_Click仅触发ONCE。我必须释放 Ctrl 并再次按下它以检测它的状态是否已关闭。
起初我以为它只是一个C#fluke,但是当我从user32.dll使用C / C ++ GetKeyState时,我看到同样的事情
[DllImport("user32.dll")]
private static extern short GetKeyState(int vKey);
使用以下代码替换上述代码:
if (e.Key == Key.S && BitConverter.GetBytes(GetKeyState(0xA2))[1] > 0)
{
ButtonSave_Click(sender, null);
}
我得到相同的行为,ButtonSave_Click只会触发一次,无论我按 S 并按下 Ctrl 键多少次。
我如何解决这个问题以及发生了什么?