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便完成了,用它來監視鍵盤事件,將會讓我們的程序實現更多個性化的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章