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

时间:2017-06-07 22:29:46

标签: winapi capslock

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

我的想法是观看通过虚拟键盘的键盘。当我看到CapsLock down事件时,我将发送CapsLock Up事件,第二个CapsLock down事件,第二个CapsLock Up事件,然后是一个控制键事件。所有这些代码都有效!但是,我无法捕获CapsLock密钥的物理UP操作。

我尝试使用win32api.GetKeyState()win32api.GetAsyncKeyState()阅读CapsLock Up键。在我填充CapsLock up事件之后,他们都说密钥已经关闭。似乎无法查看实际的硬件并发现它仍处于停机状态。

有没有办法在进入虚拟键盘缓冲区之前捕获事件?如果我能做到这一点,我可以抓住真正的CapsLock down和Up事件。但我似乎无法找到它。

我需要能够完全从win32 api执行此操作。

1 个答案:

答案 0 :(得分:1)

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

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