消息钩子注入示例

本文介绍了一个使用C++实现的键盘消息钩子(MessageHook.dll)的详细代码示例。该钩子可以捕获并记录用户的键盘输入,适用于Windows平台。文章通过具体的函数定义和调用流程展示了如何设置和取消消息钩子。

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

MessageHook.dll的h文件:
#pragma  once
extern "C" _declspec(dllexport) bool OnHook();
extern "C" _declspec(dllexport) bool OffHook();

MessageHook.dll的cpp文件:
#include "stdafx.h"
#include "MessageHook.h"
#include <stdio.h>
#include <stdlib.h>
extern HMODULE g_hModule;
HHOOK g_Hook = 0;
LRESULT CALLBACK MyKeyBoard(_In_ int    code, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
	// 判断是否wParam与lParam都有键盘消息,是的话则执行打印操作
	if (code == HC_ACTION){
		// 将256个虚拟键的状态拷贝到指定的缓冲区中,如果成功则继续
		BYTE KeyState[256] = { 0 };
		if (GetKeyboardState(KeyState)) {
			// 得到第16–23位,键盘虚拟码
			LONG  KeyInfo = lParam;
			UINT  keyCode = (KeyInfo >> 16) & 0x00ff;
			WCHAR wKeyCode = 0;
			ToAscii((UINT)wParam, keyCode, KeyState, (LPWORD)&wKeyCode, 0);
			// 将其打印出来
			WCHAR szInfo[512] = { 0 };
			swprintf_s(szInfo, _countof(szInfo), L"Hook%c", (char)wKeyCode);
			OutputDebugString(szInfo);
			return 0;
		}
	}

	return CallNextHookEx(g_Hook, code, wParam, lParam);
}

//开启消息钩子,拦截键盘消息
bool OnHook()
{
	g_Hook = SetWindowsHookEx(WH_KEYBOARD, MyKeyBoard, g_hModule, 0);
	if (g_Hook == NULL)
	{
		return false;
	}
	return true;
}
//关闭消息钩子
bool OffHook()
{
	if (g_Hook != NULL)
	{
		UnhookWindowsHookEx(g_Hook);
		return true;
	}
	return false;
}

dllmain的cpp文件:
#include "stdafx.h"
HMODULE g_hModule = 0;
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		g_hModule = hModule;
		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

调用cpp文件:
#include "stdafx.h"
#include <process.h>
#include "..\MessageHook\MessageHook.h"

#pragma comment(lib,"..\\debug\\MessageHook.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	OnHook();
	system("pause");
	OffHook();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值