-1

我正在使用一些模拟按键的代码。一切正常,我可以看到按键按预期按下(目前正在使用 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% 可靠的答案,无论 capslock/numlock 是否有效?

4

1 回答 1

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();
}
于 2012-12-04T16:23:54.837 回答