我决定以较小的规模重现这个问题,我发现了一个非常奇怪的事情 . 功能 IsKeyLocked
不会't return a result I' d期待 .
我们有这样的代码:
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 回答
我相信您看到此行为的原因是因为您的代码设置了CapsLock的状态,然后在应用程序中发生Caps键锁定事件之前检查状态 . 只需在设置CapsLock状态并检查它之间在代码中添加DoEvents()语句,就可以使示例代码正常运行 .