Windows Hook

啥是windows的鉤子?鉤子故名思議就是在嵌入到正常執行程序的功能。對于windows來說,每個系統和應用程序之間的交互是使用消息機制來進行。比如點擊應用程序上面的某個按鈕,就是發送了事件給了應用程序。windows鉤子的作用就是在事件發送給應用程序之前截獲事件,先對事件做處理,然后有兩個選擇,可以繼續拋出事件,也可以消滅時間。于是每個事件在windows上的相應都是一個事件處理鏈,沒增加一個處理的應用程序就是給這個事件處理鏈增加一個鏈接點而已。

創建鉤子

創建windows鉤子就需要三個步驟:

1 創建鉤子

2 相應鉤子接收的事件

3 卸載鉤子

?

window提供了鉤子的幾個接口:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx

?

其中最需要關注的是幾個:

SetWindowsHookEx

UnhookWindowsHookEx

CallNextHookEx

?

分別是安裝鉤子,卸載鉤子,執行下個鉤子操作。執行的順序如其名:先安裝鉤子,后處理事件,后調用下個鉤子,最后卸載鉤子。?

一個個看著三個接口:

SetWindowsHookEx

1
2
3
4
5
6
7
8
9
10
11
HHOOK WINAPI SetWindowsHookEx(
??_In_? int idHook,
??_In_? HOOKPROC lpfn,
??_In_? HINSTANCE hMod,
??_In_? DWORD dwThreadId
);

返回值是個HHOOK,就是鉤子的唯一標識,類型在c#中是個int型,如果安裝鉤子成功,返回一個int,如果安裝不成功,返回NULL。

參數:

idHook

idHook是個int類型,標識的是鉤子的類型,比如7代表鉤子監控鼠標事件,2代表鍵盤事件。這里不同的事件代表捕獲不同的消息,所以后面的消息處理事件也會有不同(這里說的不同不是事件的參數個數和類型不同,而是參數值的含義不同)。好了,這里有個問題,如果我要監控所有事件有辦法嗎?有,你可以使用4(WH_CALLWNDPROC)來捕獲所有消息。

lpfn

lpfn是個注冊回調事件,c#中可以使用delegate,這個事件大致是如下的接口:

1
2
3
4
5
6
7
8
9
LRESULT CALLBACK CallWndProc(
??_In_? int nCode,
??_In_? WPARAM wParam,
??_In_? LPARAM lParam
);

即有三個參數和一個返回值

nCode:說明下事件如何處理消息,一般如果nCode是小于0的,那么就說明這個注冊事件不能做任何處理,應該把事件傳遞給下個鉤子。為0或者其他值根據idHook有不同的含義。

wParam:一般說明這個事件消息的類型。

lParam:一般是指向一個包含具體事件的結構。

hMod

hMod是個int類型,如果鉤子的注冊事件是由dll包含的話,值非零,如果是由當前進程包含的話,則設置為Intptr.Zero(NULL)

dwThreadId

dwThreadId也是說明這個鉤子注冊的回調事件的位置,如果是0的話,則注冊的回調事件是在當前線程的。如果不是在當前的線程,則dwThreadId是非0

UnhookWindowsHookEx

1
2
3
4
5
BOOL WINAPI UnhookWindowsHookEx(
??_In_? HHOOK hhk
);

理解了SetWindowsHookEx之后,就很好理解UnhookWindowsHookEx了。

這里的HHOOK是SetWindowsHookEx函數的返回值,鉤子的唯一標識。

返回的BOOL代表卸載鉤子是否成功。

CallNextHookEx

1
2
3
4
5
6
7
8
9
10
11
LRESULT WINAPI CallNextHookEx(
??_In_opt_? HHOOK hhk,
??_In_????? int nCode,
??_In_????? WPARAM wParam,
??_In_????? LPARAM lParam
);

這個函數是用來讓事件隨著鉤子鏈繼續執行下去的。一般在注冊的回調事件中執行的,所以和注冊的回調事件有點像。

hhk:HHOOK類型(int)代表鉤子ID,但是實際上是被忽略的。

nCode,wParam,lParam具體的含義和注冊回調函數是一樣的。在使用的時候,只要將注冊回調函數接受到的參數直接傳遞給CallNextHookEx就可以了。

windows鉤子有什么作用?

借用msdn(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx)上說的幾個用途:

1 調試使用(可以監視傳遞給應用的消息)

2 作為宏使用。(你可以將你在windows的任何動作錄制成宏)

3 監控F1動作來提供幫助。(很多應用上F1動作都是調出幫助信息的)

4 模擬鍵盤和鼠標操作

5 實現基于機器學習的應用(CBT computer-based training )




本文轉自軒脈刃博客園博客,原文鏈接:http://www.cnblogs.com/yjf512/archive/2013/05/13/3075179.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP協議之Expect爬坑

前言今天,在對接一個第三方平臺開放接口時遇到一個很棘手的問題,根據接口文檔組裝好報文,使用HttpClient發起POST請求時一直超時,對方服務器一直不給任何響應。發起請求的代碼如下:using (var httpClient new HttpCli…

【ArcGIS微課1000例】0028:ArcGIS根據屬性快速分割生成多個shp文件

ArcGIS10.5及以上的版本提供了按屬性分割工具,(分析工具->提取->按屬性分割)工具。也可以使用10.2版本的分割工具,效果應該是一樣的。本文演示使用分割工具批量快速提取一個縣范圍內的多個鎮,生成多個鎮矢量shp數據。 擴展閱讀:【ArcGIS遇上Python】ArcGIS Python按…

Win11 恢復 Win10經典右鍵菜單 親測有效

管理員運行命令: reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 重…

把一個字符串里符合表情文字標簽的地方全部替換為相應的圖片的方法

1、表情數據: var emotion [{"name": "Expression_1","text": "[微笑]"},{"name": "Expression_2","text": "[撇嘴]"},{"name": "Expression_3","text&…

【ArcGIS微課1000例】0029:ArcGIS繪制平行線(構造平行公路)

在實際工作中,有時需要繪制平行線,比如道路兩邊的邊界線,可以使用“平行復制”功能快速繪制平行線,本文介紹如何使用“平行復制”功能快速繪制平行線。 1. 加載公路矢量 加載配套實驗數據包中的數據0029.rar中的矢量數據:公路。 2. 生成平行公路 點擊“編輯器”→“開始…

2017年初隨想——幾個小目標

回顧往事很慘,展望未來渺茫 2016年不順的事情一籮筐,母親追求信仰(誤入歧途)導致父母離婚,父親又遭遇車禍,現在依然癱瘓在床,意識都尚未清醒,母親卻依然杳無音信。而我則剛工作2年半…

Win11 沒有磁盤清理工具,如何清理磁盤舊的windows.old文件

win11 磁盤右鍵沒有了“磁盤清理工具” 如果想清理文件,可以打開設置(WinI)系統—存儲—清理建議 您也可以打開“存儲感知”,系統會在需要時幫你自動清理文件。

腳本進階,函數調用實例練習

一、練習:腳本:判定192.168.0.200-192.168.0.254之間哪些主機在線,要求:1、使用函數來實現一臺主機的判定過程:2、在主程序中調用此函數判定指定范圍內的所有主機的在線情況,vim ping.sh#!/bin/bash#PING()…

.NET開發云原生應用,你只差給自己加個油

為什么要云原生(Cloud Native)Cloud表示應用程序位于云中,而不是傳統的數據中心;Native表示應用程序從設計之初即考慮到云的環境,原生為云而設計,在云上以最佳姿勢運行,充分利用和發揮云平臺的彈…

java成員變量的初始化

2019獨角獸企業重金招聘Python工程師標準>>> 類變量(static變量,不需要實例化對象也可以引用) 實例變量(非static變量,需要實例化對象) 局部變量(類的成員函數中的變量) 初始化方式: 構造函數初始化 變量聲明時初始化 代碼塊初始化 java自動初始化(在構造函數執行之…

Win11 的日歷 替代

Win11 的日歷雖然漂亮,卻少了很多小功能,特別是沒有秒鐘和日程的設計,讓用慣了 Win10 的小伙伴大呼不滿。原來曾經用過360帶的日歷,可惜不支持Win11,下面這個日歷是一款功能強大、顏值很高的小工具,能夠提供…

ReactNative--React簡介

React 基礎框架,是一些實現理念,不能用來做網頁的開發和手機應用的開發 React.js 用來做網頁開發 ReactNative 移動應用開發 在學習ReactNative之前,先學習React http://reactnative.cn/ 中文網 http://facebook.github.io/react-nativ…

【ArcGIS微課1000例】0030:ArcGIS利用MXD doctor工具分析并修復mxd地圖文檔

MXD Doctor 是一個獨立的應用程序,位于 ArcGIS Desktop 安裝目錄下的 Tools 文件夾中。該工具可用于分析已損壞的 .mxd 文件。根據分析結果,可將已損壞的 .mxd 文件中所包含的實體復制到新的或現有 .mxd 文件中。 可以從所有程序 > ArcGIS > Desktop 工具中打開 MXD Do…

分析一個 .NET 寫的 某 RFID標簽系統 CPU暴漲

一:背景 1. 講故事前段時間有位朋友說他的程序 CPU 出現了暴漲現象,由于程序是買來的,所以問題就比較棘手了,那既然找到我,就想辦法幫朋友找出來吧,分析下來,問題比較經典,有必要和大…

linux開機引導過程總覽

簡單的說,系統的啟動過程如下: 1.開機自檢: 按下電源按鍵后,計算機硬件會主動讀取BIOS加載硬件信息并進行硬件的自我測試,然后系統會根據BIOS里的啟動順序讀取第一個可啟動的設備,從而移交系統控制權&#…

CentOS關機與重啟命令詳解

2019獨角獸企業重金招聘Python工程師標準>>> Linux centos重啟命令: 1、reboot  2、shutdown -r now 立刻重啟(root用戶使用)  3、shutdown -r 10 過10分鐘自動重啟(root用戶使用)  4、shutdown -r 20:35 在時間為20:35時候重啟(root用戶使用)如果…

JS正則提取字符串

河北科技師范學院歐美學院新聞標題 河南大學邁阿密學院新聞標題 首都經濟貿易大學密云分校新聞標題 北京科技大學(延慶校區)新聞標題 湖北中醫藥大學職業技術學院新聞標題 公安消防部隊高等專科學校新聞標題 從上邊的類似新聞標題中提取完整學校名稱,最終參考代…

【工具】PC端調試手機端 Html 頁面的工具

一、概述 有一個項目需要在手機端顯示一個 web 頁面,而每次把應用 launch 后,從手機端看比較麻煩,因此搜羅了幾種在 PC 端調試手機端頁面的工具。 二、工具 http://fonkie.iteye.com/blog/1846858 http://blog.csdn.net/dojotoolkit/article/…

【ArcGIS微課1000例】0031:ArcGIS中的32個拓撲規則(圖文詳解)

在地理數據庫中,拓撲是定義點要素、線要素以及面要素共享重疊幾何的方式的排列布置。例如,街道中心線與人口普查區塊共享公共幾何,相鄰的土壤面共享公共邊界。學習拓撲就必須掌握ArcGIS中常見的拓撲規則。 文章目錄 一、面的拓撲規則(10種)二、點的拓撲規則(6種)三、線的…

Blazor University (38)JavaScript 互操作 —— 從 .NET 調用 JavaScript

原文鏈接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/從 .NET 調用 JavaScriptJavaScript 應添加到服務器端 Blazor 應用程序的 /Pages/_Host.cshtml 或 Web Assembly Blazor 應用程序的 wwwroot/index.html 中。然后可以通…