重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
hook是一個英語單詞,名詞、動詞,作名詞時意思是“掛鉤,吊鉤”,作及物動詞時意思是“鉤住;引上鉤”,作不及物動詞時意思是“鉤住;彎成鉤狀”。
成都創新互聯服務緊隨時代發展步伐,進行技術革新和技術進步,經過10多年的發展和積累,已經匯集了一批資深網站策劃師、設計師、專業的網站實施團隊以及高素質售后服務人員,并且完全形成了一套成熟的業務流程,能夠完全依照客戶要求對網站進行網站設計、網站建設、建設、維護、更新和改版,實現客戶網站對外宣傳展示的首要目的,并為客戶企業品牌互聯網化提供全面的解決方案。
.hook是Windows中提供的一種用以替換DOS下“中斷”的系統機制。
雙語例句
1、Hang your coat up on that hook.
把你的上衣掛在那個掛鉤上。
2、Hang your coat on the hook.
把你的外套掛在那個鉤上。
3、You can tap into key moments in that lifecycle by implementing one or more of the lifecycle hook interfaces.
你可以通過實現一個或多個生命周期鉤子接口,切入到生命周期中的關鍵時間點。
Hook原理
每一個Hook都有一個與之相關聯的指針列表,稱之為鉤子鏈表,由系統來維護。這個列表的指針指向指定的,應用程序定義的,被Hook子程調用的回調函數,也就是該鉤子的各個處理子程序。當與指定的Hook類型關聯的消息發生時,系統就把這個消息傳遞到Hook子程。
一些Hook子程可以只監視消息,或者修改消息,或者停止消息的前進,避免這些消息傳遞到下一個Hook子程或者目的窗口。最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最后,也就是后加入的先獲得控制權。
Windows 并不要求鉤子子程的卸載順序一定得和安裝順序相反。每當有一個鉤子被卸載,Windows 便釋放其占用的內存,并更新整個Hook鏈表。如果程序安裝了鉤子,但是在尚未卸載鉤子之前就結束了,那么系統會自動為它做卸載鉤子的操作。
鉤子子程是一個應用程序定義的回調函數(CALLBACK Function),不能定義成某個類的成員函數,只能定義為普通的C函數。用以監視系統或某一特定類型的事件,這些事件可以是與某一特定線程關聯的,也可以是系統中所有線程的事件。
鉤子函數是用來給系統回調的. 簡單的說就是你注冊一個鉤子以后.發生鉤子注冊的事件. 系統就調用你注冊的鉤子函數并傳遞參數給你. 比如你注冊了一個鍵盤鉤子, 當用戶按下XX鍵的時候系統就調用你注冊的鉤子函數. 并且把用戶按下了哪些鍵當作參數傳遞過來. XX小馬就是用這個來邪惡的
麻煩采納,謝謝!
例子:
HWND hWnd = NULL; //定義成全局變量
HHOOK hKeyboard;
HHOOK hMouse;
LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lparam ) // 鼠標鉤子函數
{
return 1; // 返回非零值表示已經對當前消息進行了處理,這樣系統就不會再將這個消息傳遞給目標窗口過程
}
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lparam )
if( VK_F4 == wParam (1 == (lparam291)) ) // 系統后門:Alt+F4鍵退出程序
{
::SendMessageA( hWnd, WM_CLOSE, 0, 0 );
定義鉤子函數
鉤子函數是一種特殊的回調函數。鉤子監視的特定事件發生后,系統會調用鉤子函數進行處理。不同事件的鉤子函數的形式是各不相同的。下面以鼠標鉤子函數舉例說明鉤子函數的原型:
LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam)
參數wParam和 lParam包含所鉤消息的信息,比如鼠標位置、狀態,鍵盤按鍵等。nCode包含有關消息本身的信息,比如是否從消息隊列中移出。 我們先在鉤子函數中實現自定義的功能,然后調用函數 CallNextHookEx.把鉤子信息傳遞給鉤子鏈的下一個鉤子函數。CallNextHookEx.的原型如下:
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 參數 hhk是鉤子句柄。nCode、wParam和lParam 是鉤子函數。
當然也可以通過直接返回TRUE來丟棄該消息,就阻止了該消息的傳遞。
WINDOWS的鉤子函數可以認為是WINDOWS的主要特性之一。利用它們,您可以捕捉您自己進程或其它進程發生的事件。通過“鉤掛”,您可以給WINDOWS一個處理或過濾事件的回調函數,該函數也叫做“鉤子函數”,當每次發生您感興趣的事件時,WINDOWS都將調用該函數。一共有兩種類型的鉤子:局部的和遠程的。
局部鉤子僅鉤掛您自己進程的事件。
遠程的鉤子還可以將鉤掛其它進程發生的事件。遠程的鉤子又有兩種:
基于線程的 它將捕獲其它進程中某一特定線程的事件。簡言之,就是可以用來觀察其它進程中的某一特定線程將發生的事件。
系統范圍的 將捕捉系統中所有進程將發生的事件消息。 當您創建一個鉤子時,WINDOWS會先在內存中創建一個數據結構,該數據結構包含了鉤子的相關信息,然后把該結構體加到已經存在的鉤子鏈表中去。新的鉤子將加到老的前面。當一個事件發生時,如果您安裝的是一個局部鉤子,您進程中的鉤子函數將被調用。如果是一個遠程鉤子,系統就必須把鉤子函數插入到其它進程的地址空間,要做到這一點要求鉤子函數必須在一個動態鏈接庫中,所以如果您想要使用遠程鉤子,就必須把該鉤子函數放到動態鏈接庫中去。當然有兩個例外:工作日志鉤子和工作日志回放鉤子。這兩個鉤子的鉤子函數必須在安裝鉤子的線程中。原因是:這兩個鉤子是用來監控比較底層的硬件事件的,既然是記錄和回放,所有的事件就當然都是有先后次序的。所以如果把回調函數放在DLL中,輸入的事件被放在幾個線程中記錄,所以我們無法保證得到正確的次序。故解決的辦法是:把鉤子函數放到單個的線程中,譬如安裝鉤子的線程。
鉤子一共有14種,以下是它們被調用的時機:
WH_CALLWNDPROC 當調用SendMessage時
WH_CALLWNDPROCRET 當SendMessage的調用返回時
WH_GETMESSAGE 當調用GetMessage 或 PeekMessage時
WH_KEYBOARD 當調用GetMessage 或 PeekMessage 來從消息隊列中查詢WM_KEYUP 或 WM_KEYDOWN 消息時
WH_MOUSE 當調用GetMessage 或 PeekMessage 來從消息隊列中查詢鼠標事件消息時
WH_HARDWARE 當調用GetMessage 或 PeekMessage 來從消息隊列種查詢非鼠標、鍵盤消息時
WH_MSGFILTER 當對話框、菜單或滾動條要處理一個消息時。該鉤子是局部的。它時為那些有自己的消息處理過程的控件對象設計的。
WH_SYSMSGFILTER 和WH_MSGFILTER一樣,只不過是系統范圍的
WH_JOURNALRECORD 當WINDOWS從硬件隊列中獲得消息時
WH_JOURNALPLAYBACK 當一個事件從系統的硬件輸入隊列中被請求時
WH_SHELL 當關于WINDOWS外殼事件發生時,譬如任務條需要重畫它的按鈕.
WH_CBT 當基于計算機的訓練(CBT)事件發生時
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的應用程序很少使用
WH_DEBUG 用來給鉤子函數除錯
附:如何使用鉤子函數(接收到字母A按下時,窗體由最小化彈出的完整的代碼)
Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Public Const WH_KEYBOARD = 2
Public Const KEY_WINSTART = 91
Public Const KEY_WINMENU = 93
Global hHook As Long
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode = 0 Then
If wParam = KEY_WINMENU Or wParam = KEY_WINSTART Then
If (lParam And HC0000000) = 0 Then
MsgBox "", , ""
KeyboardProc = 1
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
Option Explicit
Private Sub Command1_Click()
form2.Show 1
End Sub
Private Sub form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0, App.ThreadID)
Me.Show
End Sub
Private Sub form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub