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