給DLL初學者 全程鍵盤鉤子的一種簡單實現

2021-04-02 11:58:25 字數 2908 閱讀 2953

隨著中介軟體技術的發展,

dll越來越為程式設計師所關注,因為使用

dll具有一系列優點,所以程式設計人員可能更多的在自己的軟體中採用這種技術。

下面我就把以前做過的乙個簡單的全程鍵盤鉤子分析一下。鉤子[

以下簡稱

hook]

是應用程式在

microsoft windows 

訊息處理過程中設定的用來監控訊息流並且處理系統中尚未到達目的視窗的某一型別訊息過程的機制。如果

hook

過程在應用程式中實現,若應用程式不是當前視窗時,該

hook

就不起作用;如果

hook

在dll

中實現,程式在執行中動態呼叫它,它能實時對系統進行監控。根據需要,我們採用的是在

dll中實現

hook

的方式[

關於hook

更詳細的資料請查閱資料]。

在vc

中新建一

win32 dynamic-link library

工程,工程名為

kblock

。會生成相關檔案,編譯生成的

kblock.cpp

:#include "stdafx.h"

#include "kblock.h"

hhook hhkhook=null;

//定義鉤子控制代碼

hinstance hinstance=null;//

程式例項

//下面的

dllmain

相當於win32

程式中的

winmain

函式,是入口點

bool apientry dllmain( handle hmodule,

dwordul_reason_for_call,

lpvoid lpreserved

)hinstance=(hinstance)hmodule;//

得到dll

例項return true;}//

這是處理鍵盤訊息的主要函式,在其中進行禁止操作

lresult callback hookproc(int ncode,wparam wparam,lparam lparam)

if (ncode != hc_action)

//if (!::findwindow(0, "keyboard locked"))

return 1;//

沒有return callnexthookex(hhkhook,ncode,wparam,lparam)

則不會把訊息

//傳遞下去,所以我們的鍵盤就不起作用了

}// this is an example of an exported variable

//匯出函式:啟動鍵盤鎖定

bool enablekeyboardcapture()

//匯出函式:解除鍵盤鎖定

bool disablekeyboardcapture()

上面就是

dll中最重要的**,當然要使

dll能正常工作還要編輯

kblock.h

檔案:__declspec(dllexport) bool enablekeyboardcapture();//

載入鉤子

__declspec(dllexport) bool disablekeyboardcapture();//

解除安裝鉤子

再編輯kblock.def

; kblock.def : declares the module parameters for the dll.

library"kblock"

description'kblock windows dynamic link library'

exports

; explicit exports can go here

enablekeyboardcapture @1

disablekeyboardcapture @2

這樣我們用

depends.exe

檢視這個

dll時,就會發現這兩個匯出函式了。

dll方面的工作已經完成,這樣我們就可以在程式中呼叫它了。

雖然dll

是由vc

開發的,但呼叫它的前台程式可以用任何其它支援

dll呼叫的語言如:vb、

vc、

delphi

、win32a**

實現,下面還是以

vc為例,實現

dll的呼叫。

建一基於

dialog

的工程,在其中加入兩個按鈕:「

lock keyboard

」「unlock」在

cexedlg

類中加入乙個成員函式:

/*sign = true

鎖定sign = false

解鎖*/

bool cexedlg::kblock(bool sign)

if(sign)

loadhook();

else

return 1;

}::messagebox(0,"

動態庫載入失敗!!!

","somthing wrong",mb_ok);

return 0;

}其中用到了事先定義好的全域性變數:

typedef bool (callback *loadhook)();

typedef bool (callback *unloadhook)();

hinstance hdll=null;

loadhook loadhook;

unloadhook unloadhook;

這樣我們在兩個按鈕中分別加入

kblock(true);

和kblock(false);

即可。

給初學者的建議

一名初學者,首先要找一本好的入門書籍 平台裡有推薦 把程式結構 資料型別,陣列 函式和結構體 這幾個部分了解 了之後,就可以 寫 程式了。千萬不要把書看的太細緻,那樣的話會覺得程式設計太繁瑣,不要背參考書式的學習。就像乙個小孩要學說話,他需要模仿和試錯,不斷的矯正,最終會很好的表達,如果一開始讓他把...

給初學者的建議

在網上看到一篇很好的文章。對於一些初學者,我覺得它很有幫助。現在把它 過來。希望大家都能從中體會到什麼。如果作者看到,原諒我把它 過來,因為它很經典。2.初學者請不要看太多太多的書那會誤人子弟的,先找本系統的學,很多人用了很久都是只對部分功能熟悉而已,不系統還是不夠的。3.看幫助,不要因為很難而自己...

給ios初學者的建議

不管你是培訓的還是在上學的或者是自學的!你選擇了這條路就要認真的對待你所學的,別出來找工作什麼都不會!首先,第一點 把你的obj c語言基礎打好,在學習obj c之前最好學一下c c 除此之外最好各課都要設計了解些,xml,json,mysql,html,js!我碰到乙個連json和xml是什麼都不...