黃易群俠傳M脫機外掛應用程式黃易神行
5938
13

[轉貼] VB鍵盤鉤子

vion 發表於 2009-3-10 15:28:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |
一、Hook簡介
Hook這個東西有時令人又愛又怕,Hook是用來攔截系統某些訊息之用,

例如說,我們想讓系統不管在什麽地方只要按個Ctl-B便執行NotePad,或許您會使用FormKeyPreview,設定為True,但在其他Process中按Ctl-B呢?
那就沒有用,這是就得設一個Keyboard Hook來攔截所有Key in的鍵;

再如:MouseMoveEvent只在該FormControl上有效,如果希望在Form的外面也能得知Mouse Move的訊息,那只好使用Mouse Hook來欄截Mouse 的訊息。

再如:您想記錄方才使用者的所有鍵盤動作或Mosue動作,以便錄巨集,那就使用JournalRecordHook,如果想停止所有Mosue鍵盤的動作,
而放(執行)巨集,那就使用JournalPlayBack HookHook呢,可以是整個系統為範圍(Remote Hook),即其他
Process的動作您也可以攔截,也可以是LocalHook,它的攔截範圍只有Process本身。
Remote HookHook Function要在.Dll之中,Local Hook則在.Bas中。
VB如何設定Hook呢?使用SetWindowsHookEx()
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
idHook代表是何種Hook,有以下幾種
Public Const WH_CALLWNDPROC = 4
Public Const WH_CALLWNDPROCRET = 12
Public Const WH_CBT = 5
Public Const WH_DEBUG = 9
Public Const WH_FOREGROUNDIDLE = 11
Public Const WH_GETMESSAGE = 3
Public Const WH_HARDWARE = 8
Public Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_MSGFILTER = (-1)
Public Const WH_SHELL = 10
Public Const WH_SYSMSGFILTER = 6
lpfn代表Hook Function所在的Address,這是一個CallBack Fucnction,當掛上某個
Hook時,我們便得定義一個Function來當作某個訊息產生時,來處理它的Function
,這個Hook Function有一定的三數格式
Private Function HookFunc(ByVal ncode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

nCode 代表是什麽請況之下所產生的Hook,隨Hook的不同而有不同組的可能值
wParam lParam 傳回值則隨Hook的種類和nCode的值之不同而不同。
因這個三數是一個 FunctionAddress所以我們屆景謢X木馬網站●ont=Times New Roman]Hook Function放在.Bas中,
並以AddressOf HookFunc傳入。至於Hook Function的名稱我們可以任意給定,不一
定叫 HookFunc
hmod 代表.DLLhInstance,如果是Local Hook,該值可以是Null(VB中可傳0進去)
而如果是Remote Hook,則可以使用GetModuleHandle(".dll名稱")來傳入。
dwThreadId 代表執行這個HookThreadId,如果不設定是那個Thread來做,則傳0(所以
一般來說,Remote Hook0進去),而VBLocal Hook一般可傳App.ThreadId進去
值回值如果SetWindowsHookEx()成功,它會傳回一個值,代表目前的HookHandle
這個值要記錄下來。
因為A程式可以有一個System Hook(Remote Hook),如KeyBoard Hook,而B程式也來設一
RemoteKeyBoard Hook,那麽到底KeyBoard的訊息誰所攔截?答案是,最後的那一個
所攔截,也就是說A先做keyboard Hook,而後B才做,那訊息被B攔截,那A呢?就看B
Hook Function如何做。如果B想讓AHook Function也得這個訊息,那B就得呼叫
CallNextHookEx()將這訊息PassA,於是產生Hook的一個連線。如果B中不想Pass這訊息
A,那就不要呼叫CallNextHookEx()
Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
hHook值是SetWindowsHookEx()的傳回值,nCode, wParam, lParam則是Hook Procedure
中的三個三數。
最後是將這Hook去除掉,請呼叫UnHookWindowHookEx()
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
hHook便是SetWindowsHookEx()的傳回值。此時,以上例來說,B程式結束Hook,則換A
以直接攔截訊息。
KeyBoard Hook的範例
Hook Function的三個三數
nCode wParam lParam 傳回值
HC_ACTION 表按鍵Virtual Key WM_KEYDOWN 若訊息要被處理傳0
反之傳1
HC_NOREMOVE
Public hHook As Long
Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <> 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)
End Function
Public Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
MyKBHFunc = 0 '表示要處理這個訊息
If wParam = vbKeySnapshot Then '偵測 有沒有按到PrintScreen
MyKBHFunc = 1 '在這個Hook便吃掉這個訊息
End If
Call CallNextHookEx(hHook, iCode, wParam, lParam) '傳給下一個Hook
End Function
只要將上面代碼放在VB的模組中,用標準VB程式就可以了,當運行該程式後,就能攔截所有鍵盤操作。
收藏收藏 分享分享 讚 幹 分享分享 FB分享
回覆

使用道具 舉報


紫雨剎 當前離線
UID
115885
熱心
58 值
嘉獎
0 次
違規
0 次
在線時間
92 小時
經驗
74 點
積分
74
精華
0
最後登錄
2011-1-4
閱讀權限
20
註冊時間
2006-12-14
論壇幣
6 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
紫雨剎 2009-3-10 17:29:44
好用的vb程式.. 謝謝你^^
回覆

使用道具 舉報

Goldenwolf 當前離線
UID
1166302
熱心
75 值
嘉獎
0 次
違規
0 次
在線時間
17 小時
經驗
75 點
積分
426
精華
0
最後登錄
2009-10-8
閱讀權限
25
註冊時間
2009-3-28
論壇幣
259 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
Goldenwolf 2009-4-1 10:03:44
我從Hook 看成H@@K 感謝大大的分享!!
回覆

使用道具 舉報

阿丼 當前離線
UID
1117583
熱心
42 值
嘉獎
0 次
違規
0 次
在線時間
49 小時
經驗
30 點
積分
30
精華
0
最後登錄
2013-10-2
閱讀權限
20
註冊時間
2009-1-24
論壇幣
66 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
400 點
查看詳細資料
Rank: 2Rank: 2
阿丼 2009-4-15 07:33:36
太屌了  我喜歡^^YCT49B
回覆

使用道具 舉報

mossjss 當前離線
UID
1208800
熱心
6 值
嘉獎
0 次
違規
0 次
在線時間
17 小時
經驗
6 點
積分
6
精華
0
最後登錄
2009-9-25
閱讀權限
5
註冊時間
2009-5-7
論壇幣
2 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 1
5
mossjss 2009-5-28 11:00:58
如要記錄使用者的動作 應如何寫??
回覆

使用道具 舉報

卍小乂樟卍 當前離線
UID
1063218
熱心
402 值
嘉獎
0 次
違規
0 次
在線時間
503 小時
經驗
387 點
積分
387
精華
0
最後登錄
2013-7-14
閱讀權限
25
註冊時間
2008-11-4
論壇幣
5 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
800 點
查看詳細資料
Rank: 3
6
卍小乂樟卍 2009-7-4 15:34:01
謝謝大大的無私分享YCT45B
回覆

使用道具 舉報

s12134546 當前離線
UID
517949
熱心
107 值
嘉獎
0 次
違規
0 次
在線時間
69 小時
經驗
104 點
積分
104
精華
0
最後登錄
2011-4-19
閱讀權限
20
註冊時間
2007-8-27
論壇幣
1 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
7
s12134546 2009-7-22 15:56:29
有影片教學嗎YCT41B YCT41B
回覆

使用道具 舉報

jaydiy 當前離線
UID
1140322
熱心
50 值
嘉獎
0 次
違規
0 次
在線時間
17 小時
經驗
54 點
積分
54
精華
0
最後登錄
2009-12-16
閱讀權限
20
註冊時間
2009-2-22
論壇幣
533 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
8
jaydiy 2009-8-2 03:07:27
感謝您的分享~ YCT65B

VB程式真的比較簡單呢~
回覆

使用道具 舉報

隨火 當前離線
UID
1294953
熱心
214 值
嘉獎
0 次
違規
0 次
在線時間
6 小時
經驗
14 點
積分
14
精華
0
最後登錄
2011-4-5
閱讀權限
10
註冊時間
2009-8-20
論壇幣
78 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 1
9
隨火 2009-9-1 10:02:23
哦原來是這樣阿謝謝你無私的分享熱情的教學
回覆

使用道具 舉報

S-BB 當前離線
UID
538360
熱心
399 值
嘉獎
0 次
違規
0 次
在線時間
114 小時
經驗
389 點
積分
2956
精華
0
最後登錄
2013-9-6
閱讀權限
40
註冊時間
2007-9-8
論壇幣
2038 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
6338 點
查看詳細資料
Rank: 5Rank: 5Rank: 5
10
S-BB 2009-9-12 11:48:31
還沒成功.....因為有錯誤.....我用的是Vb. net 如果用vb6好似就ok @_@
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

12下一頁

手機版 | Archiver | 外掛聯合國

GMT+8, 2024-11-16 05:17 , Processed in 0.074737 second(s), 17 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?