標籤:使用 資料 for ar 工作 應用 window 設計
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 用來給鉤子函數除錯