IsKeyLocked返回了奇怪的结果

时间:2012-12-04 15:35:38

标签: c# winforms keyboard

我正在使用一些模拟按键的代码。一切正常,我可以看到按键按预期按下(目前用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);
    }

可以预料,在第一次按下按钮后,结果将为True(当我运行应用程序时未按下Capslock)。但即使键盘上的LED闪亮,也是错误的。当我再次按下按钮时,结果为True,但LED不再闪烁。为什么这个函数返回错误的结果?我错过了什么或者......?

根据msdn文档:

  

确定CAPS LOCK,NUM LOCK或SCROLL LOCK键是否在   效果。

如果这是一个真实的陈述,这里究竟发生了什么?如何从C#获得100%可靠的答案,无论封锁/ numlock是否生效?

1 个答案:

答案 0 :(得分:1)

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

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