1

この問題は私を踏みにじらせました。

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はアップ状態 (ダウン状態ではない) によって発生します。

したがって、ButtonSave_Click はCtrl、キーSが押されたままキーが何度も押された場合に 1 回だけ起動します。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);
}

そして、同じ動作が得られます.ButtonSave_Clickは、何回押しSCtrlキーを押しても1回だけ起動します.

この問題を回避するにはどうすればよいですか? また、何が起こっているのでしょうか?

4

0 に答える 0