C# IsKeyLocked返回奇怪的结果

C# IsKeyLocked返回奇怪的结果,c#,winforms,keyboard,C#,Winforms,Keyboard,我正在使用一些模拟按键的代码。一切正常,我可以看到按键按得和预期一样(目前正在使用Capslock/Numlock进行测试,因此我可以看到键盘上的LED)。然而,为了满足我的需要,我需要能够100%地说出是否按下了这些键。我的应用程序行为怪异,所以我决定在更小的范围内重现这个问题,我发现了一件非常奇怪的事情。函数IsKeyLocked不会返回我期望的结果 让我们有一个这样的代码: private void btnPressButton_Click(object sender, Event

我正在使用一些模拟按键的代码。一切正常,我可以看到按键按得和预期一样(目前正在使用Capslock/Numlock进行测试,因此我可以看到键盘上的LED)。然而,为了满足我的需要,我需要能够100%地说出是否按下了这些键。我的应用程序行为怪异,所以我决定在更小的范围内重现这个问题,我发现了一件非常奇怪的事情。函数
IsKeyLocked
不会返回我期望的结果

让我们有一个这样的代码:

    private void btnPressButton_Click(object sender, EventArgs e)
    {
        KeyboardManager.PressKey(KeyCode.CapsLock);

        lblKeyboardState.Text = IsKeyLocked(Keys.CapsLock).ToString();
    }
按键方法:

    [DllImport("user32.dll", SetLastError = true)]
    private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    public static void PressKey(KeyCode keyCode)
    {
        byte code = (byte)keyCode;

        keybd_event(code, 0, KEYEVENTF_KEYDOWN, 0);
        keybd_event(code, 0, KEYEVENTF_KEYUP, 0);
    }
人们会期望,在第一次点击按钮后,结果会是真的(我运行应用程序时没有按下Capslock)。但这是错误的,即使我键盘上的LED灯亮着。当我再次按下按钮时,结果为真,但LED不再闪烁。为什么此函数返回错误的结果?我是错过了什么还是

根据msdn文件:

确定大写锁定、数字锁定还是滚动锁定键处于启用状态 效果


如果这是真的,这里到底发生了什么?如何从C#获得100%可靠的答案,capslock/numlock是否有效?

我相信您看到这种行为的原因是因为您的代码设置capslock的状态,然后在应用程序中发生Caps密钥锁定事件之前检查状态。在设置CapsLock状态和检查CapsLock状态之间,只需在代码中添加一个DoEvents()语句,就可以使示例代码正确运行

private void btnPressButton_Click(object sender, EventArgs e)
{
    KeyboardManager.PressKey(KeyCode.CapsLock);
    Application.DoEvents();
    lblKeyboardState.Text = IsKeyLocked(Keys.CapsLock).ToString();
}

这应该包含在msdn文档中!非常感谢你。