VC 鉤子實現及應用

2021-04-16 22:03:20 字數 2285 閱讀 9862

關於鉤子

請參見微軟中國社群中《

hook專題

》一文。

純c#鉤子(hook)實現

要實現系統鉤子其實很簡單,呼叫三個win32的api即可。

setwindowshookex用於設定鉤子。(設立一道卡子,盤查需要的資訊)

[dllimport( 

"user32.dll

", callingconvention 

= callingconvention.stdcall )]

public

static

extern

intptr setwindowshookex ( wh_codes idhook, hookproc lpfn,

intptr pinstance, 

int threadid );

callnexthookex用於傳遞鉤子(訊息是重要的,所以從**來,就應該回到**去,除非你決定要***息)

[dllimport( 

"user32.dll

", callingconvention 

= callingconvention.stdcall )]

public

static

extern

intcallnexthookex ( intptr phookhandle, 

int ncode,

int32 wparam, intptr lparam );

unhookwindowshookex解除安裝鉤子(解除安裝很重要,卡子設多了會造成擁堵)

[dllimport( 

"user32.dll

", callingconvention 

= callingconvention.stdcall )]

public

static

extern

bool

unhookwindowshookex ( intptr phookhandle );

在《how to:在 visual c# .net 中設定視窗掛鉤》一文中有如下描述:

在 .net 框架中不支援全域性掛鉤

您無法在 microsoft .net 框架中實現全域性掛鉤。若要安裝全域性掛鉤,掛鉤必須有乙個本機動態鏈結庫 (dll) 匯出以便將其本身插入到另乙個需要調入乙個有效而且一致的函式的程序中。這需要乙個 dll 匯出,而 .net 框架不支援這一點。託管**沒有讓函式指標具有統一的值這一概念,因為這些函式是動態構建的**。

網上查詢了很多**,大都另外包含了乙個c++的dll,用於標識包含lpfn所指的子程的dll,似乎也驗證了這一說法。

但實際上並非如此,使用如下**即可實現全域性鉤子:

intptr pinstance 

= marshal.gethinstance( assembly.getexecutingassembly().manifestmodule );

win32api.setwindowshookex( wh_mouse_ll,

m_mousehookprocedure, pinstance, 0);

注:manifestmodule屬性是.net framework 2.0中新增加的,所以當你依然使用.net framework 1.x的時候,可以使用getmodules方法獲取當前程式集的所有模組,然後用其中的乙個作為gethinstan方法的引數,來獲得合適的控制代碼指標。

鉤子應用demo-螢幕放大器

所謂螢幕放大器,類似與windows系統中的輔助工具中的放大鏡。

前兩天在找資料的時候突然發現在2.0中,graphics類多了乙個copyfromscreen方法,可以直接實現螢幕抓取,於是有了做螢幕放大器的想法。

首先我定義了是skhook類,來擷取鍵盤及滑鼠。

由於需要獲得全域性的滑鼠訊息來確定截圖位置,同時要建立乙個全域性的快捷鍵來退出程式,所以只能用上面說的鉤子來實現。

然後我通過滑鼠點來設定取樣區域,以及窗體的位置。

取樣區域為滑鼠點為中心的50*50的矩形區域。窗體位置只實現了簡單的滑鼠跟隨,同時保證了和取樣區域不重疊。

另外我使用了乙個backgroundworker來定時重新整理更新窗體。主要是為了實現動畫內容(gif、flash等)的顯示。

PHP的鉤子實現解析

php程式設計的鉤子實現,示例講解和解釋它們的作用,寫了乙個樣板的鉤子實現 鉤子是程式設計裡乙個常見的概念,非常的重要。它使得系統變得非常容易拓展 而不用理解其內部的實現機理,這樣可以減少很多任務作量 只要有乙個鉤子樣本,能很容易仿照第乙個鉤子快速的編寫第二個鉤子,這裡對鉤子進行乙個簡單的理解。下面...

利用svn鉤子實現自動匯出部署WEB應用

應用場景 開發團隊3 5人,用svn做版本控制,測試環境和資料庫在測試伺服器上,一般情況下先在本地測試完成,然後傳到伺服器測試,這樣顯得有點麻煩,集中規定將 上傳到伺服器進行測試,這裡就涉及到乙個應用自動部署的問題,有兩種思路,一種伺服器寫乙個crontab,編寫乙個shell指令碼,實時監聽伺服器...

C 利用全域性鉤子實現鍵盤鎖

在家看網課,記筆記不方便。於是就想弄個鍵盤鎖,方便學習 在寢室也好把外接鍵盤放上去打遊戲 其實這東西挺簡單的,就三行 hhook hk lresult callback kbproc intncod,wparam wparam,lparam lparam void void lresult call...