天天看點

WinAPI——鈎子函數大全

setwindowshookex

函數功能:該函數将一個應用程式定義的挂鈎處理過程安裝到挂鈎鍊中去,您可以通過安裝挂鈎處理過程來對系統的某些類型事件進行監控,這些事件與某個特定的線程或系統中的所有事件相關.

函數原形:hhook setwindowshookex( int idhook, hookproc lpfn,hinstance hmod,dword dwthreadid ); 

參數:

idhook:訓示欲被安裝的挂鈎處理過程之類型,此參數可以是以下值之一:

wh_callwndproc(4): 安裝一個挂鈎處理過程,在系統将消息發送至目标視窗處理過程之前,對該消息進行監視,詳情參見callwndproc挂鈎處理過程.

wh_callwndprocret(12) :安裝一個挂鈎處理過程,它對已被目标視窗處理過程處理過了的消息進行監視,詳情參見 callwndretproc 挂鈎處理過程.

wh_cbt(5) :安裝一個挂鈎處理過程,接受對cbt應用程式有用的消息 ,詳情參見 cbtproc 挂鈎處理過程.

wh_debug(9):安裝一個挂鈎處理過程以便對其他挂鈎處理過程進行調試, 詳情參見debugproc挂鈎處理過程.

wh_foregroundidle(11):安裝一個挂鈎處理過程,該挂鈎處理過程當應用程式的前台線程即将進入空閑狀态時被調用,它有助于在空閑時間内執行低優先級的任務.

wh_getmessage(3):安裝一個挂鈎處理過程對寄送至消息隊列的消息進行監視,詳情參見 getmsgproc 挂鈎處理過程.

wh_journalplayback(1):安裝一個挂鈎處理過程,對此前由wh_journalrecord 挂鈎處理過程紀錄的消息進行寄送.詳情參見 journalplaybackproc挂鈎處理過程.

wh_journalrecord(0):安裝一個挂鈎處理過程,對寄送至系統消息隊列的輸入消息進行紀錄.詳情參見journalrecordproc挂鈎處理過程.

wh_keyboard(2):安裝一個挂鈎處理過程對擊鍵消息進行監視. 詳情參見keyboardproc挂鈎處理過程.

wh_keyboard_ll(13):此挂鈎隻能在windows nt中被安裝,用來對底層的鍵盤輸入事件進行監視.詳情參見lowlevelkeyboardproc挂鈎處理過程.

wh_mouse(7):安裝一個挂鈎處理過程,對滑鼠消息進行監視.  詳情參見 mouseproc挂鈎處理過程.

wh_mouse_ll(14):此挂鈎隻能在windows nt中被安裝,用來對底層的滑鼠輸入事件進行監視.詳情參見lowlevelmouseproc挂鈎處理過程.

wh_msgfilter(-1):安裝一個挂鈎處理過程, 以監視由對話框、消息框、菜單條、或滾動條中的輸入事件引發的消息.詳情參見messageproc挂鈎處理過程.

wh_shell(10):安裝一個挂鈎處理過程以接受對外殼應用程式有用的通知, 詳情參見 shellproc挂鈎處理過程.

wh_sysmsgfilter(6):安裝一個挂鈎處理過程,以監視由對話框、消息框、菜單條、或滾動條中的輸入事件引發的消息.這個挂鈎處理過程對系統中所有應用程式的這類消息都進行監視.詳情參見 sysmsgproc挂鈎處理過程.

lpfn:指向相應的挂鈎處理過程.若參數dwthreadid為0或者訓示了一個其他程序建立的線程之辨別符,則參數lpfn必須指向一個動态連結中的挂鈎處理過程.否則,參數lpfn可以指向一個與目前程序相關的代碼中定義的挂鈎處理過程.

hmod:訓示了一個動态連結的句柄,該動态連接配接庫包含了參數lpfn   所指向的挂鈎處理過程.若參數dwthreadid訓示的線程由目前程序建立,并且相應的挂鈎處理過程定義于目前程序相關的代碼中,則參數hmod必須被設定為null(0).

dwthreadid:訓示了一個線程辨別符,挂鈎處理過程與線程相關.若此參數值為0,則該挂鈎處理過程與所有現存的線程相關.

傳回值:若此函數執行成功,則傳回值就是該挂鈎處理過程的句柄;若此函數執行失敗,則傳回值為null(0).若想獲得更多錯誤資訊,請調用getlaserror函數.

備注:若參數hmod為null,而參數dwthreadld為0或者訓示了一個其他程序建立的線程辨別符,則會産生錯誤.

對函數callnexthookex進行調用以下連結下一個挂鈎處理過程是可選的,但也是被推薦的否則,其他安裝了此挂鈎的應用程式将無法獲得此挂鈎通知,進而可能導緻錯誤的行為.除非您确實希望防止其他應用程式看到此挂鈎通知,您應當調用函數callnexthookex.

在終止一個應用程式之前,必須調用函數unhookwindowshookex以釋放與此挂鈎相關的系統資源.

挂鈎的作用域依賴與挂鈎的類型.一些挂鈎隻能被設定成系統作用域,其他挂鈎(如下所示)還可以被設定為某一特定線程的作用域:

wh_callwndproc           線程或系統

wh_callwndprocret        線程或系統

wh_cbt                   線程或系統

wh_debug                 線程或系統

wh_foregroundidle        線程或系統

wh_getmessage            線程或系統

wh_journalplayback       系統

wh_journalrecord         系統

wh_keyboard              線程或系統

wh_keyboard_ll           線程或系統

wh_mouse                 線程或系統

wh_mouse_ll              線程或系統

wh_msgfilter             線程或系統

wh_shell                 線程或系統

wh_sysmsgfilter          系統

對于一個特定的挂鈎類型,現成的挂鈎先被調用,然後才是系統挂鈎被調用.

系統挂鈎作為共享資源,安裝一次就對所用應用程式産生影響.所有的系統挂鈎函數必須在庫中.系統挂鈎應當被限制用于一些特殊用途的應用程式或者用來作為應用程式調試的輔助工具.不再需要挂鈎的庫應當将相應的挂鈎處理過程删除掉.

速查:windows nt:3.1以及以上版本,windows :95以及以上版本,windows ce 不支援,頭檔案winuser.h,庫檔案:使用者自定義,unicode,在windows nt上實作了unicode和ansi的版本.

shellproc

函數功能:挂鈎處理過程是應用程式或庫中定義的回調函數,它與函數 setwindowshookex搭配使用.此函數從系統接受外殼(shell)通知.類型hookproc定義了指向此類回調函數的指針.shellproc時應用程式或庫中定義的相應回調的位置标志符.

函數原形:lresult callback shellproc( int ncode, wparam wparam,lparam lparam );

ncode:訓示挂鈎類型,該參數可以是以下值之一:

hshell_accessibilitystate: 對windows nt5.0或以上版本有效,訓示"可通路性"已被改變.

hshell_activateshellwindow: shell應當激活其主視窗.

hshell_getminrect: windows 95 only: 一個視窗正在被最小化或者最大化,系統需要該視窗被最小化時的矩形坐标.

hshell_language   : windows 95 only: 鍵盤語言被改變或者一個新的鍵盤布局被加載.

hshell_redraw:    windows 95 only: 一個視窗在任務條上的标題已被重畫.

hshell_taskman:   windows 95 only: 使用者已選擇其任務清單.一個提供了任務的清單的shell應用程式當傳回true,以阻止windows開始(執行)其任務清單.

hshell_windowactivated: windows 95 only: 激活狀态已被轉移給一個不同的頂層無屬性主視窗.

hshell_windowcreated: 一個頂層無屬性主視窗已被建立.當系統調用一個sheproc函數時,該視窗存在.

hshell_windowdestroyed:一個頂層無屬性主視窗即将銷毀.當系統調用sheproc 函數時.該視窗仍然存在.

若ncode的值小于0,則此挂鈎處理過程必須将該消息不加處理地傳送給函數callnexthookex 并傳回其傳回值.

wparam: 此參數的值依賴于參數ncode,其依賴關系如下所示:

hshell_accessibilitystate: 訓示哪一個可以通路特征已被改變了狀态,可以是以下值之一:

access_filterkys,access_mousekeys,access_stickkeys.

hshell_getminrect:被最小化或者最大化的視窗句柄.hshell_language: 視窗的句柄.

hshell_redraw:被重畫的視窗的句柄.hshell_windowactivated:被激活的視窗的句柄.

hshell_windowcreated:被建立的視窗的句柄.hshell_windowdestroyed:被銷毀的視窗的句柄.

lparam:此參數的值依賴于參數ncode,其依賴關系如下所示:

hshell_getminrect:指向該rect結構的指針.hshell_language: 鍵盤布局的句柄.

hshell_redraw: 若該視窗正在閃現,則其值為true,否則為false.

hshell_windowactivated: 若該視窗是全屏模式,則其值為true,否則為false.傳回值:傳回值應為0.

備注:此挂鈎處理過程通過調用函數setwindowshookex ,指定wh_shll挂鈎類型及其相應挂鈎處理過程首位址來安裝.

速查:windows nt:3.1以及以上版本,windows :95以及以上版本,windows ce 不支援,頭檔案winuser.h,庫檔案,使用者自定義.

sysmsgproc

函數功能:挂鈎處理過程是應用程式或庫中定義的回調函數,它與函數 setwindowshookex搭配使用.當一個對話框、消息框、菜單條、或滾動條中的輸入事件發生,且由此引發的消息尚未被處理之前,系統對此挂鈎處理過程進行調用.此函數可以對系統中所有的對話框、消息框、菜單條、或滾動條消息進行監視.

類型hookproc定義了指向此類回調函數的指針.sysmsgproc 是庫中相應回調函數名的位置标志符.

函數原形:lresult callback sysmsgproc(int ncode,wparam wparam,lparam lparam);  

ncode:訓示産生此消息的輸入事件類型.此參數可以是以下值之一:

msgf_dialogbox:     輸入事件由一個消息框或者對話框産生.

msgf_menu:         輸入事件由一個菜單條産生.

msgf_scrollbar:       輸入事件由一個滾動條産生.

msgf_nextwindow:    輸入事件由于使用者摁下組合鍵<alt+tab>以激活另一個視窗而産生.

若ncode的值小于0,則此挂鈎處理過程必須将該消息不加處理地傳送給函數 callnexthookex 并傳回其傳回值.

wparam: 為null(0).

lparam: 指向msg結構的[指針].

傳回值:若ncode的值小于0,則此挂鈎處理過程必須傳回callnexthookex 的傳回值.若ncode的值大于或等于0,并且此挂鈎處理過程未對該消息進行處理,則調用函數callnexthookex 并傳回其傳回值是被推薦的.否則,其他安裝了wh_sysmsgfilter挂鈎的應用程式将無法收到此挂鈎通知,并可能由此導緻錯誤的行為.若此挂鈎處理過程處理了此消息,它應傳回一個非零值以避免系統再将此消息傳送給目标視窗處理過程.

備注:一個應用程式通過調用函數setwindowshookex 指定 wh_sysmsgfilter挂鈎類型及相應挂鈎處理過程首位址來安裝此挂鈎.

unhookwindowshookex

函數功能: 該函數将一個由setwindowshookex 安裝的挂鈎處理過程從挂鈎鍊中删除.

函數原形: bool unhookwindowshookex(hhook hhk);

hhk: 被删除的挂鈎的句柄.此參數是一個挂鈎句柄,該句柄是此前函數setwindowshookex的傳回值.

傳回值:該函數執行成功傳回非0值,失敗傳回0.

備注:即使unhookwindowshookex 函數傳回之後,該鈎子處理過程也可能正處于被其它線程調用的狀态.若目前未調用該鈎子處理過程,則在 unhookwindowshookex 函數傳回之前該鈎子處理過程被立即删除.

delhookproc:該函數已過時,它僅僅是用來與windows的16位版本相容.在32位windows系統中應當使用函數callnexthookex.

setwindowshook:該函數已過時,它僅僅是用來與windows的16位版本相容.在32位windows系統中應當使用函數setwindowshookex.

unhookwindowshook:該函數已過時,它僅僅是用來與windows的16位版本相容.在32位windows系統中應當使用函數unhookwindowshookex.

callmsgfilter

函數功能:該函數将特定消息和挂鈎代碼發送給與挂鈎 wh_sysmsgfilter和wh_msgfilter 相聯系的挂鈎處理過程,一個 wh_sysmsgfilter 或者 wh_msgfilter挂鈎處理過程是指應用程式定義的回調函數,這些回調函數負責檢查,并可有選擇地修改關于對話框、消息框、菜單條、滾動條的消息。

函數原形:bool callmsgfilter(lpmsg lpmsg, int ncode); 

參數:

lpmsg:指向一個msg結構,該結構包含發送給挂鈎處理過程的消息.

ncode:指定挂鈎處理過程需要使用的應用程式定義的代碼,以确定如何對消息進行處理,該代碼切忌采用與系統預定義的與wh_sysmsgfilter和wh_msgfilter挂鈎相關的挂鈎代碼(msgf_ 和 hc_開頭)相同的值.

傳回值:若該應用程式可對消息作進一步處理,則傳回值為0,若該應用程式不能對該消息作進一步處理,則傳回值為非0值.

備注:系統對callmsgfilter進行調用,以使得應用程式能夠檢查和控制在對對話框、消息框、菜單條、滾動條的内部處理過程中産生的,或是由使用者按下<alt+tab>組合鍵以激活不同視窗時産生的消息流.

可通過調用函數setwindowshookex來安裝此挂鈎處理過程.

速查:windows nt:3.1以及以上版本,windows :95以及以上版本,windows ce 不支援,頭檔案:winuser.h,庫檔案:user32.lib,unicode:在windows nt上實作了unicode和ansi的版本.

龍騰一族至尊龍騎

繼續閱讀