1. 程式人生 > >關於HOOK,如何通過鉤子截獲指定視窗的所有訊息 SetWindowsHookEx demo

關於HOOK,如何通過鉤子截獲指定視窗的所有訊息 SetWindowsHookEx demo

具體使用見demo ,  

請注意: 32位只能用win32庫, 64位 需要用64位 庫。64位可以hook64位程式,32位可以hook32位程式

SetWindowsHookEx   第三個引數為HINSTANCE,通過FindWindow找到指定視窗控制代碼後如何   
  得到該程序的HINSTANCE呢?

這個引數應該是你呼叫SetWindowsHookEx的DLL的模組例項控制代碼,它可以經由DllMain入口的第一個引數得到。   
  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或者指示了一個其他程序建立的執行緒識別符號,則會產生錯誤.

  至於SetWindowsHookEx的第四個引數dwThreadId,才是你需要藉由視窗控制代碼得到的視窗執行緒ID,你可以通過下面的程式碼獲得:   
  DWORD   dwThreadID   =   GetWindowThreadProcessId(hwnd,   NULL);

選擇相應的訊息鉤子,比如WH_CALLWNDPROC(用來監視視窗過程)、WH_GETMESSAGE(用來監視訊息佇列的訊息)、WH_KEYBOARD(鍵盤訊息)、WH_MOUSE(滑鼠訊息)等等。

相關推薦

關於HOOK,如何通過鉤子截獲指定視窗所有訊息 SetWindowsHookEx demo

具體使用見demo ,   請注意: 32位只能用win32庫, 64位 需要用64位 庫。64位可以hook64位程式,32位可以hook32位程式; SetWindowsHookEx   第三個引數為HINSTANCE,通過FindWindow找到指定視窗控制代碼後如何      得到該程序的H

通過安裝WH_CALLWNDPROC全域性鉤子將DLL注入所有進行視窗過程的程序

// HookDll.cpp : 定義 DLL 應用程式的匯出函式。 // #include "stdafx.h" #include <windows.h> static HHOOK hHook=NULL; HINSTANCE hInstance; //鉤子

Windows下向指定視窗模擬傳送鍵盤訊息

在作業系統中,滑鼠和鍵盤的操作會被轉換為相應的系統訊息,視窗過程在接收到訊息後會進行對應的處理。傳送訊息,我們可以使用SendMessage()和PostMessage(),所以,只要使用這兩個函式來發送滑鼠和鍵盤的相關訊息就可以了。此外,還可以通過keybd_event(

HOOK鉤子技術2 內聯鉤子Inline HOOK 通過DLL注入

dll注入很有意思,它最大的優勢在於一旦這個dll被注入,就可以訪問宿主程式整個記憶體空間。因此直接的操作dll是可以達到間接操作目標宿主程式的作用。 這次繼續使用CILHook類,不過這次是在目標程式內使用,而不是像1一樣自己跟自己玩。建立一個windows

MFC學習(18)MFC中利用HWND_BROADCAST 向其它所有視窗廣播訊息

利用HWND_BROADCAST可以向其它程序,或DLL檔案的視窗等傳送訊息. 在MSDN中如此描述的:     Handle to the window whose window procedure will receive the message. If this parameter is HWN

通過偽元素指定不同語言下的引號

ext ref round targe zhang 語言 pen tell .com 要指定不同語言下的引號,只需通過偽元素進行生成即可: <!DOCTYPE html> <html lang="en"> <head> <

Mysql 通過父節點ID獲取所有子節點數據函數

mysql return mysq char cas begin cast tid 函數 BEGIN DECLARE sTemp text; DECLARE sTempChd text; SET sTemp = ‘$‘; SET sTempChd =ca

bootstrap selectpicker 通過代碼指定選中值 BootStrap selectpicker後臺動態綁定數據 selectpicker 獲取選中option的屬性或者值

clas https title bject pop http tle oot sni bootstrap-select使用 bootstrap selectpicker 通過代碼指定選中值 $(‘#subjectno‘).selectpicker(‘val‘,(row.

Scala 獲取指定目錄所有文件

directory puts cto dir list rect tor array 單個 //獲取任意多個目錄下所有文件 def getFiles(inputs: File*): Seq[File] = { inputs.filter(_.isFile) ++

通過route指令指定筆記本同時連接外網和內網

無線 del class 指定 aid mask htm ref ida 假如你的外網網關是:X.X.X.X 內網網關:192.168.1.1 則在命令窗口輸入以下兩條命令: route add 0.0.0.0 mask 0.0.0.0 X.X.X.X route add

Python3基礎 os listdir 列舉指定所有文件及文件夾的名字

規範 pep sco uid leg ubunt sudo tps java ? python : 3.7.0 OS : Ubuntu 18.04.1 LTS

MySQL、SQL server 、Oracle資料庫中查詢所有的資料庫,查詢指定資料庫所有表名,查詢所有的欄位的名字

MySQL中查詢所有資料庫名和表名 1.查詢所有資料庫 show databases; 2.查詢指定資料庫中所有表名 select table_name from information_schema.tables where table_schema='database_name' a

通過HTTP請求獲取RabbitMQ佇列訊息的方法

https://www.jianshu.com/p/9edf12944935 由於自動化測試的需要,現在要用一種簡單的方法可以獲取並驗證RabbitMQ中的訊息,而不是費勁通過程式再寫一個消費者。其實,RabbitMQ提供了HTTP API,可以幫助我們實現這個需求。 1. RabbitMQ

Spring boot 中通過profile屬性指定配置檔案

1、多Profile檔案 1 通過在配置檔案中配置 一個專案在開發的過程中可能存在搓個配置檔案一個是生產環境,一個是測試環境,那麼如何去指定呢? 我們知道在主配置檔案編寫的時候,檔名可以是 application-{profile}.properties/yml。 預設使用a

Python 通過瀏覽器 開啟指定網址

1.通過預設瀏覽器開啟網頁 import webbrowser webbrowser.open("http://www.baidu.com")  webbrowser.open(url, new=0, autoraise=True) 在系統的預設瀏覽器中訪問url地址,如果new=0, url會在

應用程式通過WebSocket自行推送業務訊息給Subscriber的實現

首先是使用 Spring Boot 構建包含 WebSocket 的工程。然後定義一個 Java-Config 的 WebSocket :  @Configuration @EnableWebSocketMessageBroker public class WebSocket

個人總結多屆程式設計流量老師團隊線上培訓學員易語言視窗投遞訊息大全使用心得

**個人總結多屆程式設計流量老師團隊線上培訓學員易語言視窗投遞訊息大全使用心得: 視窗.傳送訊息 函式功能: 將指定的訊息傳送到一個視窗,同win32 api 裡面的SendMessage等同的效果 中文函式原型: 傳送訊息(hwnd,msg,wparam,iparam) 英文函式原型: s

Centos7通過yum安裝指定版本的PHP

1、安裝源 安裝epel-release:yum -y install epel-release  安裝yum-config-manager實用程式:yum -y install yum-utils 2、安裝PHP 選擇對應的版本進行安裝 安裝PHP5.4:yu

mysql 獲得指定資料庫所有表名以及指定表的所有欄位名

SELECT COLUMN_NAME 列名, DATA_TYPE 欄位型別, COLUMN_COMMENT 欄位註釋 FROM information_schema. COLUMNS WHERE

工具:Spy++ —— 視窗訊息檢視分析利器

1,簡介 Microsoft Spy++是一個非常好的檢視Windows作業系統的視窗、訊息、程序、執行緒資訊的工具,簡單易用,功能強大。 2,下載地址 3,使用場景 (1)我經常用來查詢一個不知道從哪裡彈出來的廣告視窗是哪個程序搞的鬼……然後