C 中使用Hook(鉤子)

2021-09-05 15:14:31 字數 2697 閱讀 9203

鉤子(hook),是windows訊息處理機制的乙個平台,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理window訊息或特定事件。

關於hook的詳細介紹,在微軟的msdn中有,

下面是我在c#中來應用hook:

實現效果:

當使用者在textbox中輸入 b 的時候,textbox 始終顯示 a

實現過程:

2、在form1中,新增下面一些變數:

internal enum hooktype //列舉,鉤子的型別

//msgfilter = -1,

//journalrecord = 0,

//journalplayback = 1,

keyboard = 2,

//getmessage = 3,

//callwndproc = 4,

//cbt = 5,

//sysmsgfilter = 6,

//mouse = 7,

//hardware = 8,

//debug = 9,

//shell = 10,

//foregroundidle = 11,

//callwndprocret = 12,

//keyboardll = 13,

//mousell = 14,

intptr _nexthookptr; //記錄hook編號

3、在form1中引入必須的api

[dllimport("kernel32.dll")]

static extern int getcurrentthreadid(); //取得當前執行緒編號的api

[dllimport("user32.dll")]

internal extern static void unhookwindowshookex(intptr handle); //取消hook的api

[dllimport("user32.dll")]

internal extern static intptr setwindowshookex(int idhook, [marshalas(unmanagedtype.functionptr)] hookproc lpfn, intptr hinstance, int threadid); //設定hook的api

[dllimport("user32.dll")]

internal extern static intptr callnexthookex(intptr handle, int code, intptr wparam, intptr lparam); //取得下乙個hook的api

4、宣告乙個實現的委託

internal delegate intptr hookproc(int code, intptr wparam, intptr lparam);

5、新增自己的hook處理過程

intptr myhookproc(int code, intptr wparam, intptr lparam)

if( code < 0 ) return callnexthookex(_nexthookptr,code, wparam, lparam); //返回,讓後面的程式處理該訊息

if( wparam.toint32() == 98 || wparam.toint32() == 66 ) //如果使用者輸入的是 b

this.textbox1.text = "a";

return (intptr) 1; //直接返回了,該訊息就處理結束了

else

return intptr.zero; //返回,讓後面的程式處理該訊息

6、新增加入hook鏈和從hook鏈中取消的函式

public void sethook()

if( _nexthookptr != intptr.zero ) //已經勾過了

return;

hookproc myhookproc = new hookproc(myhookproc); //宣告乙個自己的hook實現函式的委託物件

_nexthookptr = setwindowshookex((int)hooktype.keyboard, myhookproc , intptr.zero , getcurrentthreadid()); //加到hook鏈中

public void unhook()

if( _nexthookptr != intptr.zero )

unhookwindowshookex(_nexthookptr); //從hook鏈中取消

_nexthookptr = intptr.zero;

7、在form1的load事件中新增 sethook() , 在form1的closing 事件中新增 unhook()

private void form1_load(object sender, system.eventargs e)

sethook();

private void form1_closing(object sender, system.componentmodel.canceleventargs e)

unhook();

8、執行

輸入 b , 發現 textbox 裡面顯示的是 a 了!

鉤子 HOOK 機制的使用

wh mouse,gethookinfo,hinstance,getcurrentthreadid mymousehook.callbackfun callbackf mymousehook.isrun not mymousehook.isrun end end procedure uninstal...

HOOK使用 全域性鍵盤鉤子

define win32 winnt 0x0500 設定系統版本,可以使用底層鍵盤鉤子 define wm my shorts wm user 105 include windows.h 全域性變數 lpword g lpdwvirtualkey null keycode 陣列的指標 int g n...

鉤子 HOOK 機制的使用

wh mouse,gethookinfo,hinstance,getcurrentthreadid mymousehook.callbackfun callbackf mymousehook.isrun not mymousehook.isrun end end procedure uninstal...