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

2012-03-22 18:32:12|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 操作系统|来源:唯设编程网

4.2  安装键盘钩子的成员函数:
// 安装钩子函数
BOOL CKeyboardHook::startHook(HWND hWnd)
{
    BOOL bResult=FALSE;
    glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
    if(glhHook!=NULL)
        bResult=TRUE;
    glhDisplayWnd=hWnd;
    //设置显示目标窗口标题编辑框的句柄
    return bResult;
}

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

HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);

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

4.3  卸载键盘钩子的成员函数:
// 卸载钩子函数
BOOL CKeyboardHook::stopHook(void)
{
    BOOL bResult=FALSE;
    if(glhHook)
    {
        bResult= UnhookWindowsHookEx(glhHook);
        if(bResult)
        {
            glhPrevTarWnd=NULL;
            glhDisplayWnd=NULL;//清变量
            glhHook=NULL;
        }
    }
    return bResult;
}

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

BOOL UnhookWindowsHookEx(
    HHOOK hhk
);

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

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

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

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//钩子函数的实现
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wparam,LPARAM lparam);

CKeyboardHook::CKeyboardHook(void)
{
}

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

//钩子函数的实现
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    if(((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode))
    {
        if(wParam==VK_NUMPAD0)
            SendMessage(glhDisplayWnd,WM_HOOK_ATTACK,0,0);
    }
    return CallNextHookEx( glhHook, nCode, wParam, lParam );
}

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

 

<12>
发表评论0条 】
网友评论(共?条评论)..
Win7环境使用VC2008编写DLL实现键盘钩子