鉤子編程

鉤子編程

鉤子是Windows訊息處理機制的要點,Windows訊息從硬體的輸入到應用程式之間的傳遞。

基本介紹

  • 中文名:鉤子編程
  • 外文名:Hook programming
  • 定義:Windows訊息處理機制的要點
  • 分類:全局鉤子和執行緒局部鉤子
  • 系統:計算機
  • 學科:計算機技術
概述,鉤子範圍,鉤子類型,

概述

當在應用程式中設定多個鉤子函式以後,應用程式中的鉤子函式組成一個與鉤子相關聯的指向鉤子函式的指針列表。當鉤子函式監視的訊息到達以後,Windows系統首先將訊息送到指針列表所指向的第一個鉤子函式中,這個鉤子函式對訊息進行監視、修改、控制後,再將訊息傳遞到下一個鉤子函式中,再次進行處理,這樣直到到達鉤子鍊表的最後。在鉤子鍊表對訊息處理完成以後,訊息仍然被送到應用程式的視窗中進行處理。
鉤子函式攔截了訊息,並且進行了一些處理,這顯然影響了程式的效率,但是這種付出的回報是程式設計師可以對某些感興趣的訊息進行控制。鉤子函式的本質就是一個處理系統訊息的函式,通過應用程式將函式掛入到系統中,對系統訊息進行攔截和處理。

鉤子範圍

根據鉤子函式監視的訊息範圍不同,鉤子分為全局鉤子和執行緒局部鉤子。執行緒局部鉤子僅僅是對本進程中的某個執行緒的訊息進行攔截和處理。全局鉤子則是對系統的全部訊息進行攔截。全局鉤子的實現要比局部鉤子困難一些,它要監視所有的系統訊息並進行處理。
全局鉤子函式的實現必須封裝在獨立的動態程式庫中,才可以被各種各樣的相關聯的應用程式所使用。局部鉤子不一定在動態程式庫中實現,但經常的做法是仍然在動態程式庫中實現,這樣可以被多個應用程式所使用,這正是動態程式庫的優勢所在。

鉤子類型

按事件分類,有如下常用的鉤子類型。
(1)鍵盤鉤子和低級鍵盤鉤子:監視各種鍵盤訊息。
(2)滑鼠鉤子和低級滑鼠鉤子:監視各種滑鼠訊息。
(3)外殼鉤子:監視各種Shell事件訊息,如啟動和關閉應用程式。
(4)日誌鉤子:記錄從系統訊息佇列中取出的各種事件訊息。
(5)視窗過程鉤子:監視所有從系統訊息佇列發往日標視窗的訊息。
按使用范同分類,主要有執行緒鉤子和系統鉤子。
(1)執行緒鉤子:監視指定執行緒的事件訊息。
(2)系統鉤子:監視系統中的所有執行緒的事件訊息,因為它影響系統中的所有應用程式,所以鉤子函式必須放在獨立的動態程式庫(DLL)中,這是系和執行緒鉤子的主要不同。
13種鉤子的說明如下。
(1) WH_CALLWNDPROC和WH_CALLWNDPROCRET:監視傳送到視窗過程的訊息。系統在訊息傳送到接收視窗過程之前調用WH_CALLWNDPROC鉤子子程,處理訊息之後調用WH_CALLWNDPROCRET鉤子子程後傳遞指針到CWPRETSTRUCT結構。該結構包含來自處理訊息視窗過程的返回值,以及與這個訊息關聯的訊息參數。
(2) WH_CBT:在以下事件之前,系統調用WH_CBT鉤子子程。
激活、建立、銷毀、最小化、最火化、移動及改變尺寸等視窗事件。
完成系統指令事件。
來自系統訊息佇列中的移動滑鼠和鍵盤事件。
設定輸入焦點事件。
同步系統訊息佇列事件。
鉤子子程的返回值確定系統是否允許或者禁止這些操作中的一個。
(3)WH__DEBUG:可以使用此鉤子決定是否允許系統調用與其他鉤子關聯的鉤子子程。
(4) WH_FOREGROUNDIDLE:應用程式的前台執行緒處於空閒狀態時,可使用WH_該鉤子執行低優先權的任務。
(5) WH_GETMESSAGE:應川程式使用該鉤子監視從GetMessage或PeekMessage函式返同的訊息。
(6) WH_JOURNALPLAYBACK:使應用程式可以插入訊息到系統訊息佇列,該鉤子返回逾時值通知系統處理來自回放鉤子當前訊息前的等待時間(毫秒)。
(7) WH_JOURNALRECORD:監視和記錄輸入事件。
(8) WH_KEYBOARD:在應用程式中使該鉤子監視WM_KEYDOWN利WM_KEYUP訊息。
(9) WH_KEYBOARD_LL:監視輸入到執行緒訊息佇列中的鍵盤訊息。
(10) WH_MOUSE:監視從GetMessage或PeekMessage函式返同的滑鼠訊息。
(11) WH_MOUSE_LL:監視輸入到執行緒訊息佇列中的滑鼠訊息。
(12) WH_MSGFILTER和WH_SYSMSGFILTER:前者僅監視傳遞到選單、滾動條、訊息框及傳遞到安裝鉤子子程的套用稗序建立的對話框訊息。後者可監視所有應用程式訊息。
(13) WH_SHELL:系統在以下情況調用該鉤子子程。
·產生、激活或銷毀一個top-level或unowned視窗
·系統列需要重畫某個按鈕。
·系統需要系統列顯示一個程式的最小化形式。
·改變目前鍵盤布局。
·執行任務管理器或相同級別的程式。
按照慣例,外殼應剛程式不接收WH_SHELL訊息,所以應用程式能夠接收該訊息之前序必須調用SystemParametersInfo函式註冊自身。
需要說明的問題如下。
(1)對於同一事件(如滑鼠訊息)安裝了執行緒鉤子利系統鉤子,則系統首先調用前者。
(2)對同一事件訊息可安裝多個鉤子處理過程,這些鉤子處理過程形成了鉤子鏈,處理當前鉤子後應把鉤子信息傳遞給下一個鉤子函式。
(3)鉤子,特別是系統鉤子會消耗訊息處理時間,降低系統性能。只有在必要時才安裝鉤子,在使用後要及時卸載。

相關詞條

熱門詞條

聯絡我們