C 鉤子函式使用

2022-04-04 13:46:32 字數 3598 閱讀 1707

hook(鉤子)是windows提供的一種訊息處理機制平台,是指在程式正常執行中接受資訊之前預先啟動的函式,用來檢查和修改傳給該程式的資訊,(鉤子)實際上是乙個處理訊息的程式段,通過系統呼叫,把它掛入系統。每當特定的訊息發出, 在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦即鉤子函式先得到控制權。這時鉤子函式即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞(return)。

c#是.net framework平台的相伴語言,用它本身的類庫和編譯器提供的方法是無法實現全域性鉤子的。但實際上對於非託管**的呼叫在c#中是成立的,鉤子函式存在於user32.dll中,使用dllimport屬性可以引用非託管**類庫中的方法。

//

安裝鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

int setwindowshookex(int idhook, hookproc lpfn, intptr hinstance, int threadid);

//

解除安裝鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

bool unhookwindowshookex(int idhook);

//

呼叫下乙個鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

int callnexthookex(int idhook, int ncode, intptr wparam, intptr lparam);

//

委託+事件(把鉤到的訊息封裝為事件,由呼叫者處理)

public

delegate

void mousemovehandler(object

sender, mouseeventargs e);

public

event mousemovehandler mousemoveevent;

public

class

mousehook

set }}}

private

inthhook;

public

const

int wh_mouse_ll = 14

;

public

win32api.hookproc hproc;

public mousehook()

public

intsethook()

public

void

unhook()

private

int mousehookproc(int

ncode, intptr wparam, intptr lparam)

else

}//委託+事件(把鉤到的訊息封裝為事件,由呼叫者處理)

public

delegate

void mousemovehandler(object

sender, mouseeventargs e);

public

event

mousemovehandler mousemoveevent;

}

public

partial

class

form1 : form

mousehook mh;

private

void form1_load(object

sender, eventargs e)

void mh_mousemoveevent(object

sender, mouseeventargs e)

,)", x, y);

}private

void form1_formclosed(object

sender, formclosedeventargs e)

}

需要引入using system.runtime.interopservices; 命名空間

public

class

win32api

[structlayout(layoutkind.sequential)]

public

class

mousehookstruct

public

delegate

int hookproc(int

ncode, intptr wparam, intptr lparam);

//安裝鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

int setwindowshookex(int idhook, hookproc lpfn, intptr hinstance, int

threadid);

//解除安裝鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

bool unhookwindowshookex(int

idhook);

//呼叫下乙個鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

int callnexthookex(int idhook, int

ncode, intptr wparam, intptr lparam);

}

執行結果:

滑鼠在視窗移動的時候,顯示滑鼠當前的座標位置(在整個顯示螢幕中的座標)。

鉤子函式使用小結

鉤子函式使用小結 首先讓我們看看hook函式是怎麼安裝 呼叫和刪除的。應用程式通常是呼叫setwindowshookex 函式來進行安裝的,其函式的原型如下 setwindowshookex int idhook,hookproc lpfn,hinstance hmod,dword dwthread...

flask 鉤子函式使用

一 鉤子函式的概念 鉤子函式是windows訊息處理機制的一部分,通過設定 鉤子 應用程式可以在系統級對所有訊息 事件進行過濾,訪問在正常情況下無法訪問的訊息。鉤子的本質是一段用以處理系統訊息的程式,通過系統呼叫,把它掛入系統。二 常用的三大鉤子函式 註冊乙個函式,在處理第乙個請求之前執行.def ...

mounted鉤子函式 對vue中鉤子函式的理解

1 beforecreate 鉤子 該階段元件例項剛建立,元件屬性計算之前 可理解為元件屬性還未初始化,未繫結,未掛載元素el 比如 el,data,methods等,如果你試圖在beforecreated鉤子中獲取這些屬性值,會得到ubdefined 的結果,但是 可以獲取到this物件,因為此時...