向虚拟键盘缓冲区发送 KEYEVENTF_KEYUP 后检测物理 CapsLock 位置

Detect physical CapsLock position after sending a KEYEVENTF_KEYUP to the Virtual Keyboard Buffer

我正在开发一个程序,可以使 CapsLock 键作为 Windows 下的控制键。我知道这可以通过注册表更改轻松完成。不幸的是,我无法 运行 更改注册表,也无法 运行 设备驱动程序。

我的想法是观察虚拟键盘上的按键扫描。当我看到 CapsLock 按下事件时,我将发送一个 CapsLock Up 事件、第二个 CapsLock 按下事件、第二个 CapsLock Up 事件,然后是一个控制键按下事件。所有这些代码都有效!但是,我没能捕捉到 CapsLock 键的物理 UP 动作。

我已经尝试使用 win32api.GetKeyState()win32api.GetAsyncKeyState() 读取 CapsLock Up 键。在我填充 CapsLock up 事件后,他们都说键已启动。好像没办法看实际硬件,看到还是宕机。

有没有办法在事件进入虚拟键盘缓冲区之前捕获事件?如果我能做到这一点,我就能捕捉到真正的 CapsLock down 和 Up 事件。但是我好像找不到。

我需要能够完全从 win32 api。

GetKeyState 是您的线程上次收到消息时所处的状态。 GetAsyncKeyState 是当前状态。如果您尝试拉取状态更改,这些函数可能会错过事件。

使用低级别 keyboard hook 在输入处理链的早期查看所有输入。如果您不关心全局事件,您也可以使用普通的键盘挂钩来挂钩您的线程。