机械键盘的问题
买来的机械键盘存在连击情况,打字码代码的时候实在是痛苦,搜索了解决方案,大多数是清理硬件等方法,于是考虑能否通过软件的方法解决,就有了本篇文章。
程序
github下载地址:https://github.com/wanderersean/keyStrikeHook
使用方式在github上都有,若是win7用户,可以直接下载.exe文件,讲道理可以直接使用,若是不行,用g++或者vs编译一下。
几点注意:
- 双击完.exe文件后没有界面,其实已经运行了,可以在任务管理器里面查看
- 使用前记得把exe文件添加到杀毒软件的白名单,或者暂时关闭安全软件。因为程序的实现涉及到键盘的底层钩子,杀软可能会偷偷屏蔽掉这一功能,导致莫名其妙的问题
- 有时候软件会失灵,如腾讯游戏的防护机制会屏蔽掉键盘钩子等功能,凑合着用吧大兄弟。。。
思路
思路非常简单,几条关键点如下:
- 利用
SetWindowsHookExA
设置键盘钩子WH_KEYBOARD_LL
。这是windows系统的底层钩子,按照msdn的说法要使用DLL注入方式,但在网上搜索的时候有人说WH_KEYBOARD_LL是不需要用DLL的,其实现原理并不是注入到各个桌面程序当中,而是之间将回调函数插在回调函数链的第一个位置。这一点msdn上表达有误,总之实践出真知,该功能的实现的确不需要DLL编程。 - 在回调函数当中设置标记变量为false,用来标记是否阻止键盘输入。同时设置一个定时器,定时器的间隔为60ms,如果没到60ms又有新的按键被按下(这时候往往是连击),则过滤掉该按键消息。
- 定时器到达60ms后触发定时器的回调函数,在定时器的回调函数当中设置标记变量为true并且删除该定时器。
具体的编程逻辑请参考代码,若感觉有用,请送个star哈,谢谢!