1. 程式人生 > >Win7環境使用VC2008編寫DLL實現鍵盤鉤子

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