SetWindowsHookEx
作用:將應用程序定義的鉤子過程安裝到鉤子鏈中。您將安裝一個掛鉤程序來監視系統的某些類型的事件。這些事件與特定線程或與調用線程在同一桌面中的所有線程相關聯。
HHOOK WINAPI SetWindowsHookEx(_In_ int idHook,_In_ HOOKPROC lpfn,_In_ HINSTANCE hMod,_In_ DWORD dwThreadId );參數說明:
dHook [in]
類型:int
要安裝的掛鉤程序的類型。此參數可以是以下值之一。
| WH_CALLWNDPROC4 | 在系統將其發送到目標窗口過程之前,安裝一個監視消息的掛接過程。有關更多信息,請參閱CallWndProc掛鉤過程。 |
| WH_CALLWNDPROCRET12 | 安裝一個掛鉤過程,用于在目標窗口過程處理消息后監視消息。有關更多信息,請參閱CallWndRetProc掛鉤過程。 |
| WH_CBT五 | 安裝鉤子程序,接收對CBT應用程序有用的通知。有關更多信息,請參閱CBTProc鉤子過程。 |
| WH_DEBUG9 | 安裝一個掛鉤程序,用于調試其他鉤子程序。有關更多信息,請參閱DebugProc掛鉤過程。 |
| WH_FOREGROUNDIDLE11 | 安裝掛鉤過程,當應用程序的前臺線程即將變為空閑時,該過程將被調用。此掛接對于在空閑時間內執行低優先級任務很有用。有關更多信息,請參閱ForegroundIdleProc掛鉤過程。 |
| WH_GETMESSAGE3 | 安裝掛鉤過程,監視發送到消息隊列的消息。有關更多信息,請參閱GetMsgProc鉤子過程。 |
| WH_JOURNALPLAYBACK1 | 安裝一個掛鉤過程,用于發送先前由WH_JOURNALRECORD掛鉤過程記錄的消息。有關更多信息,請參閱JournalPlaybackProc掛鉤過程。 |
| WH_JOURNALRECORD0 | 安裝掛鉤過程,記錄發布到系統消息隊列的輸入消息。這個鉤子對于記錄宏很有用。有關更多信息,請參閱JournalRecordProc掛鉤過程。 |
| WH_KEYBOARD2 | 安裝一個監視按鍵消息的掛鉤過程。有關詳細信息,請參閱KeyboardProc掛鉤過程。 |
| WH_KEYBOARD_LL13 | 安裝一個掛鉤程序來監控低級別的鍵盤輸入事件。有關更多信息,請參閱LowLevelKeyboardProc鉤子過程。 |
| WH_MOUSE7 | 安裝一個監視鼠標消息的掛鉤過程。有關更多信息,請參閱MouseProc掛鉤過程。 |
| WH_MOUSE_LL14 | 安裝一個掛鉤程序來監控低級別的鼠標輸入事件。有關更多信息,請參閱LowLevelMouseProc鉤子過程。 |
| WH_MSGFILTER-1 | 安裝一個掛鉤過程,用于監視在對話框,消息框,菜單或滾動條中由于輸入事件而生成的消息。有關更多信息,請參閱MessageProc掛鉤過程。 |
| WH_SHELL10 | 安裝一個鉤子過程,接收對shell應用程序有用的通知。有關詳細信息,請參閱ShellProc鉤子過程。 |
| WH_SYSMSGFILTER6 | 安裝一個掛鉤過程,用于監視在對話框,消息框,菜單或滾動條中由于輸入事件而生成的消息。掛鉤過程監視與調用線程相同的桌面中的所有應用程序的這些消息。有關更多信息,請參閱SysMsgProc鉤子過程。 |
lpfn [in]
類型:HOOKPROC
指向掛鉤過程的指針。如果dwThreadId參數為零或指定由不同進程創建的線程的標識符,則lpfn參數必須指向DLL中的掛接過程。否則,lpfn可以指向與當前進程相關聯的代碼中的掛鉤過程。
hMod [in]
類型:HINSTANCE
包含lpfn參數指向的鉤子過程的DLL的句柄。所述HMOD參數必須設置為NULL,如果dwThreadId參數指定由當前進程,并且如果鉤子程序是與當前過程相關聯的所述代碼中創建的線程。
dwThreadId [in]
類型:DWORD
掛鉤過程與之關聯的線程的標識符。對于桌面應用程序,如果此參數為零,則掛接過程與運行在與調用線程相同的桌面中的所有現有線程相關聯。有關Windows Store應用程序,請參閱備注部分。
返回值
類型:HHOOK
如果函數成功,則返回值是掛鉤過程的句柄。
如果函數失敗,返回值為NULL。要獲取擴展錯誤信息,請調用GetLastError。
備注
SetWindowsHookEx可以用于將DLL注入到另一個進程中。32位DLL不能被注入到64位進程中,64位DLL不能被注入到32位進程中。如果應用程序需要在其他進程中使用掛鉤,則需要32位應用程序調用SetWindowsHookEx將32位DLL注入32位進程,64位應用程序調用SetWindowsHookEx來注入64位DLL進入64位進程。32位和64位DLL必須具有不同的名稱。
因為鉤子在應用程序的上下文中運行,所以它們必須與應用程序的“位置”匹配。如果32位應用程序在64位Windows上安裝全局鉤子,則將32位鉤子注入每個32位進程(通常的安全邊界)。在64位進程中,線程仍被標記為“掛鉤”。但是,由于32位應用程序必須運行鉤子代碼,系統會在掛鉤應用程序的上下文中執行鉤子; 具體來說,在調用SetWindowsHookEx的線程上。這意味著掛鉤應用程序必須繼續抽取消息,否則可能會阻止64位進程的正常運行。
如果64位應用程序在64位Windows上安裝全局鉤子,則將64位鉤子注入到每個64位進程中,而所有32位進程都對掛鉤應用程序使用回調。
要掛起64位Windows安裝桌面上的所有應用程序,請安裝32位全局鉤子和64位全局鉤子,每個鉤子都從適當的進程中進行,并且一定要在掛鉤應用程序中抽取消息以避免阻止正常運行。如果您已經有32位全局掛鉤應用程序,并且不需要在每個應用程序的上下文中運行,則可能不需要創建64位版本。
如果hMod參數為NULL并且dwThreadId參數為零或指定由另一進程創建的線程的標識符,則可能會發生錯誤。
調用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 | 全球唯一 |
對于指定的鉤子類型,首先調用線程鉤子,然后調用全局鉤子。請注意,在安裝鉤子的線程上,而不是線程處理鉤子,可以調用WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL和低級鉤子。對于這些鉤子,如果一個32位鉤子在鉤鏈中的64位鉤子的前面,則可能會調用32位和64位鉤子。
全局鉤子是一個共享資源,安裝程序會影響與調用線程相同的桌面中的所有應用程序。所有全局鉤子函數都必須在庫中。全局鉤子應該限于專用應用程序或在應用程序調試期間用作開發幫助。不再需要鉤子的庫應該刪除其掛鉤過程。
Windows Store應用程序開發如果dwThreadId為零,則Windows Store應用程序進程和Windows Runtime代理進程的窗口掛鉤DLL未被加載,除非它們由UIAccess進程(輔助工具)安裝。該通知在安裝程序的線程上提供了這些鉤子:
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_KEYBOARD_LL
WH_MOUSE
WH_MOUSE_LL
這種行為類似于鉤子DLL和目標應用程序進程之間的架構不匹配時發生的情況,例如,當鉤子DLL為32位,應用程序進程為64位時。
總結
以上是生活随笔為你收集整理的SetWindowsHookEx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 针对监控摄像机(海康、大华等)进行手动录
- 下一篇: Selenium简介以及selenium