回調函數和鉤子函數的說明

回調函數:數據結構

回調函數是應用程序提供給Windows系統DLL或其它DLL調用的函數,通常用於截獲消息、獲取系統信息或處理異步事件。應用程序把回調函數的地址指針告訴DLL,而DLL在適當的時候會調用該函數。回調函數必須遵照事先規定好的參數格式和傳遞方式,不然DLL一調用它就會引發程序或系統的崩潰。一般狀況下,回調函數採用標準WindowsAPI的調用方式,即__stdcall,固然,DLL編制者能夠本身定義調用方式,但客戶程序也必須遵照相同的規定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數都按值傳遞,函數返回以前本身負責把參數從堆棧中彈出。異步

    簡單的說就是回調函數函數不是系統定義的,而是應用程序本身定義的一個由系統來調用的函數,因此顯然,它的參數必須按照約定來,即,參數是預先定義好的。函數

鉤子函數:spa

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 用來給鉤子函數除錯 

相關文章
相關標籤/搜索