Win7环境使用VC2008编写DLL实现键盘钩子

来源:VC编程网


钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

使用钩子可以让我们的应用程序实现许多个性化的功能,VC凭借着对系统api方便调用的优势,用它来编写实现钩子的应用程序非常方便,Win7环境使用VC2008编写DLL实现鼠标钩子介绍了鼠标钩子的编写方法,本文将继续介绍键盘钩子的编写方法。


1. 项目设置:

启动VC2008以后,新建项目到当前解决方案,项目类型选择:Visual C++->Win32->Win32项目,在应用程序设置界面,将应用程序类型设置成DLL,在添加公共头文件以用于栏勾选MFC复选框。

为了DLL导出函数的编写方便,你也可以在附加选项栏勾选导出符号。


2. 添加自定义消息ID


#define WM_HOOK_LBUTTONUP WM_USER+100

该自定义消息用于键盘事件触发时钩子DLL将鼠标事件发送给接收消息的窗体。


3. 添加处理键盘钩子的类CKeyboardHook

键盘钩子类CMouseHook主要用于启动和停止键盘钩子,该类继承自CObject,其头文件的完整声明如下:

 

#pragma once

#include "afx.h"

#define WM_HOOK_ATTACK WM_USER+100        //攻击消息

 

classAFX_EXT_CLASS CKeyboardHook :

    publicCObject

{

public:

    CKeyboardHook(void);

    ~CKeyboardHook(void);

    // 安装钩子函数

    BOOLstartHook(HWNDhWnd);

    // 卸载钩子函数

    BOOLstopHook(void);

};


4. 键盘钩子的类CKeyboardHook类成员函数的定义

下面将介绍CKeyboardHook类成员函数的定义代码:

4.1 鼠标钩子类CKeyboardHook类的构造和析构函数:

 

CKeyboardHook::CKeyboardHook(void)

{

}

 

CKeyboardHook::~CKeyboardHook(void)

{

    stopHook();

}

构造函数没有进行任何初始化工作,不过在析构函数中不要忘记调用stopHook函数卸载键盘钩子。

4.2  安装键盘钩子的成员函数:

 

// 安装钩子函数

BOOL CKeyboardHook::startHook(HWND hWnd)

{

    BOOLbResult=FALSE;

    glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);

    if(glhHook!=NULL)

        bResult=TRUE;

    glhDisplayWnd=hWnd;

    //设置显示目标窗口标题编辑框的句柄

    returnbResult;

}

安装钩子的成员函数接受一个HWND的形参,用于向其发送关注的键盘事件消息,启动键盘钩子主要用到了api函数SetWindowsHookEx,其参数KeyboardProc是一个全局函数,该函数的具体定义我们将在后续内容介绍。安装钩子函数SenWindowsHookEx的原型如下:

 

HHOOK SetWindowsHookEx(

    int idHook,

    HOOKPROC lpfn,

    HINSTANCEhMod,

    DWORDdwThreadId

);

该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关。更详细的用法请参考MSDN。

4.3  卸载键盘钩子的成员函数:

 

// 卸载钩子函数

BOOL CKeyboardHook::stopHook(void)

{

    BOOLbResult=FALSE;

    if(glhHook)

    {

        bResult= UnhookWindowsHookEx(glhHook);

        if(bResult)

        {

            glhPrevTarWnd=NULL;

            glhDisplayWnd=NULL;//清变量

            glhHook=NULL;

        }

    }

    returnbResult;

}

该函数实现钩子的卸载和CKeyboardHook类的清理工作,卸载钩子用到的api函数是UnhookWindowsHookEx,该函数的原型如下:

 

BOOL UnhookWindowsHookEx(

    __in HHOOKhhk

);

参数hhk是一个键盘钩子的ID,即SetWindowsHookEx的返回值,该函数的返回值表示卸载钩子是否成功。


5. 在KeyboardHook.cpp文件中声明键盘钩子函数KeyboardProc

该函数是键盘钩子的具体实现函数,不能是类的成员函数,必须申明为全局函数,其申明形式如下:

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

//钩子函数的实现

LRESULTWINAPI KeyboardProc(intnCode,WPARAMwparam,LPARAMlparam);

 

CKeyboardHook::CKeyboardHook(void)

{

}

KeyboardProc函数的的主要功能是对键盘事件进行判断,如果是我们关心的键盘事件,则将其以消息的方式发送到预先设定接收消息的窗口进行处理。具体实现代码如下:

 

//钩子函数的实现

LRESULTWINAPI KeyboardProc(intnCode,WPARAMwParam,LPARAMlParam)

{

    if(((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode))

    {

        if(wParam==VK_NUMPAD0)

            SendMessage(glhDisplayWnd,WM_HOOK_ATTACK,0,0);

    }

    returnCallNextHookEx( glhHook, nCode, wParam, lParam );

}

到此,一个使用VC实现的键盘钩子DLL便完成了,用它来监视键盘事件,将会让我们的程序实现更多个性化的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值