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

[轉貼] VB鍵盤鉤子

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

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

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

再如:您想記錄方才使用者的所有鍵盤動作或Mosue動作,以便錄巨集,那就使用JournalRecordHook,如果想停止所有Mosue鍵盤的動作,
而放(執行)巨集,那就使用JournalPlayBack Hook;Hook呢,可以是整個系統為範圍(Remote Hook),即其他
Process的動作您也可以攔截,也可以是LocalHook,它的攔截範圍只有Process本身。
Remote Hook的Hook 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的值之不同而不同。
因這個三數是一個 Function的Address所以我們屆景謢X木馬網站●ont=Times New Roman]Hook Function放在.Bas中,
並以AddressOf HookFunc傳入。至於Hook Function的名稱我們可以任意給定,不一
定叫 HookFunc
hmod 代表.DLL的hInstance,如果是Local Hook,該值可以是Null(VB中可傳0進去),
而如果是Remote Hook,則可以使用GetModuleHandle(".dll名稱")來傳入。
dwThreadId 代表執行這個Hook的ThreadId,如果不設定是那個Thread來做,則傳0(所以
一般來說,Remote Hook傳0進去),而VB的Local Hook一般可傳App.ThreadId進去
值回值如果SetWindowsHookEx()成功,它會傳回一個值,代表目前的Hook的Handle,
這個值要記錄下來。
因為A程式可以有一個System Hook(Remote Hook),如KeyBoard Hook,而B程式也來設一
個Remote的KeyBoard Hook,那麽到底KeyBoard的訊息誰所攔截?答案是,最後的那一個
所攔截,也就是說A先做keyboard Hook,而後B才做,那訊息被B攔截,那A呢?就看B的
Hook Function如何做。如果B想讓A的Hook Function也得這個訊息,那B就得呼叫
CallNextHookEx()將這訊息Pass給A,於是產生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, 2026-9-25 16:40 , Processed in 0.074518 second(s), 16 queries , Memcache On.

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

回頂部
第二步?
第三步?