我正试图找到一种方法来拦截和阻止全局与WinAPI的CapsLock
切换事件。
我曾尝试将SetWindowsHookEx
与WH_KEYBOARD_LL
一起使用,并检查WPARAM=WM_KEYDOWN || WPARAM=WM_SYSKEYDOWN
消息,但这导致我在按住/按下CapsLock
时拦截/阻止CapsLock
,而不仅仅是在实际切换CapsLock
时。
它只拦截切换的事件对我来说很重要,因为某些软件(如屏幕阅读器)可以使用CapsLock
的单次按下或按住作为修改符,这不是我想破坏的东西。我尝试过使用GetKeyState(VK_CAPITAL)&1
并发送CapsLock
与SendInput
,但我宁愿拦截它,并阻止它,如果可能的话。
有没有什么方法可以连接到GetKeyState(VK_CAPITAL)&1
所做的任何事情?
2条答案
按热度按时间bqf10yzr1#
使用GetAsyncKeyState检测caps键何时/是否被按下,以及它的当前状态,然后调用keybd_event以编程方式将caps键设置回您希望的状态。
in this link中包含以下代码片段(沿着其他设置代码),执行时将打开或关闭CAPS锁定:
在应用程序中部署此实现(
GetAsyncKeyState
/keybd_event
组合)的建议方法是将其封装到永久循环中的工作线程集,并将sleep()
设置为允许大约每100 ms采样一次状态。(Note,我相信
GetAsyncKeyState()
比GetKeyState()
更能改进您在这里想要做的事情,因为GetKeyState()
从线程的消息队列中获取键的状态。该状态并不反映与硬件相关的中断级状态。GetAsyncKeyState()
指定自上次调用GetAsyncKeyState()
以来是否按下了键,以及键当前是向上还是向下。)jobtbby32#
您可以使用SetWindowsHookEx设置一个低级钩子。请参考线程:Best way to intercept pressing of Caps Lock