1

这个问题让我一头雾水。

如果我按住CtrlKey 并按任意键,程序会成功地将其记录在 WPF Window.KeyUp 事件中并按预期执行:

private void Window_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.S && Keyboard.IsKeyDown(Key.LeftCtrl))
    {
        ButtonSave_Click(sender, null);
    }
}

然后事情变得有趣了。这仅适用于事件被触发的“第一次”。如果我继续按住 Left Ctrl 并S再次按下,则事件会在状态LeftCtrl为 up(而不是 down)时触发。

因此,ButtonSave_Click 仅Ctrl在按住键S并多次按下键时才会触发一次。我必须释放Ctrl并再次按下它才能检测到它的状态为关闭。

起初我以为这只是 C# 侥幸,但在使用来自 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);
}

而且我得到相同的行为,无论我按下多少次S并按住Ctrl键,ButtonSave_Click 都只会触发一次。

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

4

0 回答 0