rel="file-list" href="file:///e:/temp/msohtml1/01/clip_filelist.xml" />一.鉤子過程就像是乙個監聽
|偵查者,
os先把訊息發給鉤子過程,鉤子捕獲訊息後再決定對訊息的處理
二.安裝鉤子過程的原型說明
hhook setwindowshookex( int
idhook
, hookproc
lpfn
,
hinstancehmod,dworddwthreadid);
idhook
是指定安裝鉤子過程的型別,如
wh_mouse
lpfn
是指向相應的鉤子過程,若引數
dwthreadid為0
,或者指向其他程序建立的執行緒表示符號,則
lpfn
應該指向動態鏈結庫中的鉤子過程
hmod
指向lpfn
所在的dll
的控制代碼,
if dwthreadid
由當前程序建立
and
鉤子過程在當前程序相關**中,
hmod
應該是null
dwthreadid
指向與鉤子過程相關的程序,若為
0,則鉤子與桌面上執行的所有程序都相關
返回值:是所安裝的鉤子過程的控制代碼,返回非零表示已經對訊息進行處理,如果返回
0,則系統把訊息傳遞給目標視窗過程
安裝鉤子的乙個例子:
hhook g_hmouse=null;
lresult callback mouseproc(
int ncode,// hook code
wparam wparam,// message identifier
lparam lparam// mouse coordinates )
g_hmouse=setwindowshookex(wh_mouse,mouseproc,null,getcurrentthreadid() );
三。鉤子鏈的概念:可以安裝多個鉤子程序形成鉤子鏈,最後安裝的鉤子總在鏈的前面,鉤子過程完成對訊息的處理後可以呼叫lresult callnexthookex( hhook
hhk
,
intncode,wparamwparam, lparamlparam);
訊息傳遞給鉤子鏈的下乙個鉤子過程
hhk
指定當前鉤子過程控制代碼,就是呼叫setwindowshookex返回值
四,遮蔽組合鍵訊息
lresult callback keyboardproc(int ncode,wparam wparam,lparam lparam)
if( vk_f4==wparam && ( 1==(lparam>>29 & 1) ) )
lparam
的第29位:如果alt按下,則其值為1,否則為0
五,捕獲訊息後重發另乙個訊息
在訊息捕獲後可以用sendmessage來傳送訊息
sendmessage
有三個版本,分別是全域性的,cwindow的,cwnd的
鉤子是全域性函式,應該呼叫全域性的sendmessage
sendmessage
的第乙個引數是目標視窗控制代碼,我們應該用乙個全域性變數來儲存他,定義全部變數g_hwnd,在oninitdialog中把m_hwnd賦值給g_hwnd
然後::sendmessage(g_hwnd,wm_close,0,0);
六,全域性鉤子,前面我們介紹的鉤子全部是當前程序內的,駐於程序記憶體內。只能處理當前程序的訊息,如果我們想遮蔽當前正在執行的所有程序的的滑鼠鍵盤訊息,那麼鉤子過程必須放到動態鏈結庫中。
setwindowshookex
的第三個引數要求指定鉤子過程所在dll模組控制代碼,兩種方式實現,首先是用dllmain,定義全域性例項g_hinst,然後在dllmain函式中儲存系統傳遞過來的dll模組控制代碼
hinstance g_hinst;
bool winapi dllmain( hinstance hinstdll,dword fdwreason, lpvoid lpvreserved)
void sethook()
另一種方法是呼叫getmodulehandle函式來得到指定dll模組控制代碼,如果指定的模組已經被對映到當前程序中了,那麼該函式返回該指定模組的控制代碼,模組名是.exe或者.dll
七,模組定義檔案
library hook //
指定dll內部名稱
exports//
指定該dll匯出函式名稱,從dll匯出函式是有序號的,可以自己制定序號,用@ith
sethook @2
八,dll的使用,載入dll,呼叫dll裡的函式
把dll檔案複製到客戶程式目錄下
在呼叫dll的函式之前宣告
_declspec(dllimport) void sethook();
表明sethook是從dll的lib檔案中輸入的,為了能連線上hook.dll,需要在link選項卡中輸入???hook.lib,這樣就可以呼叫dll中的函式了
九,鉤子的解除安裝
unhookwindowshookex(g_hmouse);
十,深入**
當dll被多個程序使用時,這些程序可以共享dll的**和資料。但似乎並沒有共享,如果多個程序可以共享同乙份可寫入資料的話是很危險的。假設dll中資料區有乙個指標型別變數,如果第乙個程序修改了這個變數的位址值,第二個程序如果共享這個變數的話,這個修改後的位址可能指向其他資料。
為了解決這個問題,windows採用寫入時複製機制,當某程序要修改資料時,將複製一片完全一樣的dll資料空間,這樣你訪問你的,別人訪問的還是修改前的資料。
c 鉤子學習筆記
包括系統鉤子和執行緒鉤子,或者叫全域性鉤子和私有鉤子。系統鉤子需要乙個單獨的dll,這個地方耽誤了不少時間,網上有說可以不用單獨dll的。現在開始貼 參照了紅黑聯盟中的一篇文章。複製 如下 public class sethook public abstract class hooks hookty...
Yaf學習筆記之鉤子與外掛程式
yaf中定義了6個鉤子 hook 相當於事件,在外掛程式 plugin 類中定義與鉤子相同名稱的方法,註冊之後,這些方法便會被框架自動呼叫。觸發順序 名稱觸發時機說明1 routerstartup 路由之前 觸發最早的乙個事件 2routershutdown 路由結束之後 3dispatchloop...
python學習筆記 flask之請求鉤子
before first request 在處理第乙個請求前執行。before request 在每次請求前執行。after request response 在每次請求後執行 沒有未處理異常的情況 teardown request response 在每次請求後執行 有無異常都可以,debug模式...