本線程鉤子

鉤子其實就是調用一下API而已:

?

1、安裝鉤子:
  SetWindowsHookEx
??? 函數原形:HHOOK SetWindowsHookEx(
?????????????????????? int?????? idHook,??? // 鉤子類型,
?????????????????????? HOOKPROC? lpfn,????? // 鉤子函數地址
?????????????????????? INSTANCE? hMod,????? // 鉤子所在的實例的句柄,
?????????????????????? DWORD???? dwThreadId // 鉤子所監視的線程的線程號
????????????????????? )
??? hMod: 對于線程序鉤子,參數傳NULL;
??? 對于系統鉤子:參數為鉤子DLL的句柄
  dwThreadId:對于全局鉤子,該參數為NULL。
??? 鉤子類型用WH_CALLWNDPROC=4(發送到窗口的消息。由SendMessage觸發)
??? 返回:成功:返回SetWindowsHookEx返回所安裝的鉤子句柄;
????????? 失敗:NULL;

?

2、回調,你要截獲消息就在這里進行:
LRESULT WINAPI MyHookProc(
????????? int???? nCode ,???? // 指定是否需要處理該消息
????????? WPARAM? wParam,???? // 包含該消息的附加消息
????????? LPARAM? lParam????? // 包含該消息的附加消息
??????????????????????? )

?

3、調用下一個鉤子
LRESULT CallNextHookEx(
????????? HHOOK?? hhk,????? // 是您自己的鉤子函數的句柄。用該句柄可以遍歷鉤子鏈
????????? int???? nCode,??? // 把傳入的參數簡單傳給CallNextHookEx即可
????????? WPARAM? wParam,?? // 把傳入的參數簡單傳給CallNextHookEx即可
????????? LPARAM? lParam??? // 把傳入的參數簡單傳給CallNextHookEx即可
????????????????????? );

?

4、用完后記得卸載鉤子哦,要不然你的系統會變得奇慢無比!
BOOL UnhookWindowsHookEx(
???????? HHOOK????? hhk?????? // 要卸載的鉤子句柄。
????????????????????? )

?

把上面這些API用C#封裝一下,就可以直接用了!
給個線程鉤子的例子吧(兩個Form都在同一個線程中運行):

?

using System.Runtime.InteropServices;

?

public class Form1 : System.Windows.Forms.Form
{
??? ...
??? //定義委托(鉤子函數,用于回調)
??? public delegate int HookProc(int code, IntPtr wparam, ref CWPSTRUCT cwp);

?

??? //安裝鉤子的函數
??? [DllImport("User32.dll",CharSet = CharSet.Auto)]
??? public static extern IntPtr SetWindowsHookEx(int type, HookProc hook, IntPtr instance, int threadID);
??? //調用下一個鉤子的函數
??? [DllImport("User32.dll",CharSet = CharSet.Auto)]
??? public static extern int CallNextHookEx(IntPtr hookHandle, int code, IntPtr wparam, ref CWPSTRUCT cwp);
??? //卸載鉤子
??? [DllImport("User32.dll",CharSet = CharSet.Auto)]
??? public static extern bool UnhookWindowsHookEx(IntPtr hookHandle);
??? //獲取窗體線程ID
??? DllImport("User32.dll",CharSet = CharSet.Auto)]
??? public static extern int GetWindowThreadProcessId(IntPtr hwnd, int ID);

?

??? private HookProc hookProc;
??? private IntPtr hookHandle = IntPtr.Zero;

?

??? public Form1()
??? {
??????? ....
??????? //掛接鉤子處理方法
??????? this.hookProc = new HookProc(myhookproc);
??? }

?

??? //開始攔截
private bool StartHook()
??? {
??????? Form2 f=new Form2();
??????? f.Show();//加上這個
??????? //安裝鉤子,攔截系統向Form2發出的消息
??????? this.hookHandle = SetWindowsHookEx(4, hookProc, IntPtr.Zero ,GetWindowThreadProcessId(f.Handle,0));
??????? return (this.hookHandle != 0);
??? }

?

??? //停止攔截
??? private bool StopHook()
??? {
??????? return UnhookWindowsHookEx(this.hookHandle);
??? }

?

??? //鉤子處理函數,在這里攔截消息并做處理
??? private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
??? {
??????? switch(code)
??????? {
??? case 0:
??? switch(cwp.message)
??? {
??????? case 0x0000F://WM_PAINT,攔截WM_PAINT消息
??????????????? //do something
??????? break;
??? }
??????????? break;
??????? }
??????? return CallNextHookEx(hookHandle,code,wparam, ref cwp);
??? }
???
??? [StructLayout(LayoutKind.Sequential)]
??? public struct CWPSTRUCT
??? {
?public IntPtr lparam;
?public IntPtr wparam;
?public int message;
?public IntPtr hwnd;
??? }
}

?

public class Form2 : System.Windows.Forms.Form
{
??? ....
}

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

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

相關文章

Maven Web項目解決跨域問題

跨域問題目前筆者所用到的方案大致有三種:jsonp,SpringMVC 4以上注解方式和cros三方過濾器。 Jsonp JSONP(JSON with Padding)是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問(這…

為什么Facebook的API以一個循環作為開頭?

作者 | Antony Garand譯者 | 無明如果你有在瀏覽器中查看過發給大公司 API 的請求,你可能會注意到,JSON 前面會有一些奇怪的 JavaScript:為什么他們會用這幾個字節來讓 JSON 失效?為了保護你的數據 如果沒有這些字節,那…

城市軌道交通運營票務管理論文_城市軌道交通運營管理專業就業前景怎么樣?中職優選告訴你...

??城市軌道交通運營管理專業,專業就業前景怎么樣?就業方向有哪些?有很多同學都感覺很迷忙,為了讓更多的同學們了解城市軌道交通運營管理專業的就業前景與就業方向,整理出以下內容希望可以幫助同學們。城市軌道交通運…

計算機視覺對掃描文件分類 OCR

通過計算機視覺對掃描文件分類 一種解決掃描文檔分類問題的深度學習方法 在數字經濟時代, 銀行、保險、治理、醫療、法律等部門仍在處理各種手寫票據和掃描文件。在業務生命周期的后期, 手動維護和分類這些文檔變得非常繁瑣。 對這些非機密文檔進行簡…

從錢龍數據中讀取股票權息信息導入到數據庫

從錢龍數據中讀取股票權息信息導入到數據庫 前面寫了如果讀股票代碼和日線數據,下面是如何讀股票的權息信息。 錢龍中權息數據存儲在QLDATA/history/shase/weight和QLDATA/history/sznse/weight目錄下,每個文件對應一只股票。 與前文一樣,只貼…

笑話生成器_爸爸笑話發生器

笑話生成器(If you’re just here for the generated jokes, scroll down to the bottom!)(如果您只是在這里生成笑話,請向下滾動到底部!) I thought: what is super easy to build, yet would still get an approving chuckle if someone found it on …

AWS Amplify Console:賦予應用程序快速部署的能力

AWS re:Invent 2018大會發布了很多新功能和服務,包括新的AWS Amplify Console,一種針對移動Web應用程序的持續部署服務。 AWS Amplify Console承諾可以支持快速發布新功能,避免在部署應用程序時停機,并降低同時更新應用程序客戶端…

機器學習實踐二 -多分類和神經網絡

本次練習的任務是使用邏輯歸回和神經網絡進行識別手寫數字(form 0 to 9, 自動手寫數字問題已經應用非常廣泛,比如郵編識別。 使用邏輯回歸進行多分類分類 練習2 中的logistic 回歸實現了二分類分類問題,現在將進行多分類,one vs…

Hadoop 倒排索引

倒排索引是文檔檢索系統中最常用的數據結構,被廣泛地應用于全文搜索引擎。它主要是用來存儲某個單詞(或詞組)在一個文檔或一組文檔中存儲位置的映射,即提供了一種根據內容來查找文檔的方式。由于不是根據文檔來確定文檔所包含的內…

koa2異常處理_讀 koa2 源碼后的一些思考與實踐

koa2的特點優勢什么是 koa2Nodejs官方api支持的都是callback形式的異步編程模型。問題:callback嵌套問題koa2 是由 Express原班人馬打造的,是現在比較流行的基于Node.js平臺的web開發框架,Koa 把 Express 中內置的 router、view 等功能都移除…

Bind9的dns解析服務

前言隨著原中國電信集團按南北地域分家,新的中國電信和網通集團隨即成立,互聯網的骨干網也被一分為二了,北有網通、南有電信。從此,細心的網民可以發現,有些經常訪問的網站速度一下子慢了下來,有時候還有訪…

上凸包和下凸包_使用凸包聚類

上凸包和下凸包I recently came across the article titled High-dimensional data clustering by using local affine/convex hulls by HakanCevikalp in Pattern Recognition Letters. It proposes a novel algorithm to cluster high-dimensional data using local affine/c…

sqlmap手冊

sqlmap用戶手冊 | by WooYun知識庫 sqlmap用戶手冊 當給sqlmap這么一個url (http://192.168.136.131/sqlmap/mysql/get_int.php?id1) 的時候,它會: 1、判斷可注入的參數 2、判斷可以用那種SQL注入技術來注入 3、識別出哪種數據庫 4、根據用戶選擇&…

幸運三角形 南陽acm491(dfs)

幸運三角形 時間限制:1000 ms | 內存限制:65535 KB 難度:3描述話說有這么一個圖形,只有兩種符號組成(‘’或者‘-’),圖形的最上層有n個符號,往下個數依次減一,形成倒置…

jsforim

var isMouseDownfalse;var isFirsttrue;var centerdivObj;var ndiv1;var ndiv2;var ndiv3;var kjX;var kjY; window.οnerrοrfunction(){ return true;}; var thurlhttp://qq.jutoo.net/;var wzId12345; function createDiv(){ var sWscreen.width; var sHscree…

決策樹有框架嗎_決策框架

決策樹有框架嗎In a previous post, I mentioned that thinking exhaustively is exhausting! Volatility and uncertainty are ever present and must be factored into our decision making — yet, we often don’t have the time or data to properly account for it.在上一…

湊個熱鬧-LayoutInflater相關分析

前言 最近給組內同學做了一次“動態換膚和換文案”的主題分享,其中的核心就是LayoutInflater類,所以把LayoutInflater源碼梳理了一遍。巧了,這周掘金新榜和部分公眾號都發布了LayoutInflater或者換膚主題之類的文章。那只好站在各位大佬的肩膀…

ASP.NET Core文件上傳、下載與刪除

首先我們需要創建一個form表單如下: <form method"post" enctype"multipart/form-data" asp-controller"UpLoadFile" asp-action"FileSave"> <div> <div> <p>Form表單多個上傳文件:</p> <input type…

8 一點就消失_消失的莉莉安(26)

文|明鳶Hi&#xff0c;中午好&#xff0c;我是暖叔今天是免費連載《消失的莉莉安》第26章消失的莉莉安??往期鏈接&#xff1a;▼ 向下滑動閱讀1&#xff1a;“消失的莉莉安(1)”2&#xff1a; 消失的莉莉安(2)3&#xff1a;“消失的莉莉安(3)”4&#xff1a;“消失的莉莉安…

透明的WinForm窗體

this.Location new System.Drawing.Point(100, 100); this.Cursor System.Windows.Forms.Cursors.Hand; // 定義在窗體上&#xff0c;光標顯示為手形 this.Text "透明的WinForm窗體&#xff01;"; // 定義窗體的標題…