使用GetKeyState和Keyboard.KeyIsDown按下另一个键时,修饰符键的状态将重置

时间:2012-12-19 00:56:43

标签: c# wpf keyboard key modifier

这个问题让我筋疲力尽。

如果我按住 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 键多少次。

我如何解决这个问题以及发生了什么?

0 个答案:

没有答案