引用 C 鉤子本執行緒內訊息攔截

2021-03-31 08:56:30 字數 1678 閱讀 4621

鉤子其實就是呼叫一下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

//開始攔截

private bool starthook()

//停止攔截

private bool stophook()

//鉤子處理函式,在這裡攔截訊息並做處理

private int myhookproc(int code, intptr wparam, ref cwpstruct cwp)

break;

}return callnexthookex(hookhandle,code,wparam, ref cwp);

}[structlayout(layoutkind.sequential)]

public struct cwpstruct

}public class form2 : system.windows.forms.form

C 鉤子本執行緒內訊息攔截

鉤子其實就是呼叫一下api而已 1 安裝鉤子 setwindowshookex 函式原形 hhook setwindowshookex int idhook,鉤子型別,hookproc lpfn,鉤子函式位址 instance hmod,鉤子所在的例項的控制代碼,dword dwthreadid 鉤...

C 鉤子本執行緒內訊息攔截

選擇自 xdev 的 blog 關鍵字 引用 c 鉤子本執行緒內訊息攔截 出處http blog.csdn.yiruoyun archive 2004 10 17 140219.aspx 鉤子其實就是呼叫一下api而已 1 安裝鉤子 setwindowshookex 函式原形 hhook setwi...

C 鉤子本執行緒內訊息攔截

鉤子其實就是呼叫一下api而已 1 安裝鉤子 setwindowshookex 函式原形 hhook setwindowshookex int idhook,鉤子型別,hookproc lpfn,鉤子函式位址 instance hmod,鉤子所在的例項的控制代碼,dword dwthreadid 鉤...