SetWindowsHookEx詳解 [轉]


http://blog.csdn.net/mmllkkjj/article/details/6627188

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

 

函數原形: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,則該掛鈎處理過程與所有現存的線程相關.

注:若線程標示符為0,該鈎子為全局鈎子,鈎子回調函數只能存在於Dll動態鏈接庫中,否則鈎子無效。

 

返回值:若此函數執行成功,則返回值就是該掛鈎處理過程的句柄;若此函數執行失敗,則返回值為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: 鍵盤語言被改變或者一個新的鍵盤布局被加載.

 

來源:(http://blog.sina.com.cn/s/blog_626a27090100f0m3.html) - 鈎子函數大全_老代碼_新浪博客

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掛鈎類型及相應掛鈎處理過程首地址來安裝此掛鈎.

 

速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,頭文件winuser.h,庫文件,用戶自定義.

 

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的版本.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM