有没有办法钩CapsLock切换事件,而不是只是释放/按住?

vltsax25  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(176)

我正试图找到一种方法来拦截和阻止全局与WinAPI的CapsLock切换事件。
我曾尝试将SetWindowsHookExWH_KEYBOARD_LL一起使用,并检查WPARAM=WM_KEYDOWN || WPARAM=WM_SYSKEYDOWN消息,但这导致我在按住/按下CapsLock时拦截/阻止CapsLock,而不仅仅是在实际切换CapsLock时。
它只拦截切换的事件对我来说很重要,因为某些软件(如屏幕阅读器)可以使用CapsLock的单次按下或按住作为修改符,这不是我想破坏的东西。我尝试过使用GetKeyState(VK_CAPITAL)&1并发送CapsLockSendInput,但我宁愿拦截它,并阻止它,如果可能的话。
有没有什么方法可以连接到GetKeyState(VK_CAPITAL)&1所做的任何事情?

bqf10yzr

bqf10yzr1#

使用GetAsyncKeyState检测caps键何时/是否被按下,以及它的当前状态,然后调用keybd_event以编程方式将caps键设置回您希望的状态。
in this link中包含以下代码片段(沿着其他设置代码),执行时将打开或关闭CAPS锁定:

RUN keybd_event ({&VK_CAPITAL}, 0, {&KEYEVENTF_KEYUP},       0, OUTPUT intResult).
RUN keybd_event ({&VK_CAPITAL}, 0, {&KEYEVENTF_EXTENDEDKEY}, 0, OUTPUT intResult).
RUN keybd_event ({&VK_SHIFT}, 0, {&KEYEVENTF_KEYUP},       0, OUTPUT intResult).
RUN keybd_event ({&VK_SHIFT}, 0, {&KEYEVENTF_EXTENDEDKEY}, 0, OUTPUT intResult).

在应用程序中部署此实现(GetAsyncKeyState/keybd_event组合)的建议方法是将其封装到永久循环中的工作线程集,并将sleep()设置为允许大约每100 ms采样一次状态。
(Note,我相信GetAsyncKeyState()GetKeyState()更能改进您在这里想要做的事情,因为GetKeyState()从线程的消息队列中获取键的状态。该状态并不反映与硬件相关的中断级状态。GetAsyncKeyState()指定自上次调用GetAsyncKeyState()以来是否按下了键,以及键当前是向上还是向下。)

jobtbby3

jobtbby32#

您可以使用SetWindowsHookEx设置一个低级钩子。请参考线程:Best way to intercept pressing of Caps Lock

相关问题