鉤子(hook),是windows訊息處理機制的乙個平台,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理window訊息或特定事件。
關於hook的詳細介紹,在微軟的msdn中有,http://.microsoft.***/china/***munity/program/originalarticles/techdoc/hook.mspx">http://.microsoft.***/china/***munity/program/originalarticles/techdoc/hook.mspx
下面是我在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,
//sy**sgfilter = 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.***ponentmodel.canceleventargs e)
unhook();
8、執行
輸入 b , 發現 textbox 裡面顯示的是 a 了!
C 中來應用Hook
鉤子 hook 是windows 訊息處理機制的乙個平台 應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理 window 訊息或特定事件。關於hook的詳細介紹,在微軟的msdn中有,...
C 中來應用Hook
鉤子 hook 是windows訊息處理機制的乙個平台,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理window訊息或特定事件。關於hook的詳細介紹,在微軟的msdn中有,htt...
在C 中應用HOOK
鉤子 hook 是windows 訊息處理機制的乙個平台 應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理 window 訊息或特定事件。關於hook的詳細介紹,在微軟的msdn中有,...