Hook简介

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所以我们固定将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" Alias "CallNextHookEx" _
  
  
        (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" Alias "UnhookWindowsHookEx"  _
  
  
        (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
  
  
 
  
  
至于其他的 Hook的详细资料与nCode,wParam, lParam的意义,请查Win32 Help或Windows 95: A Developer's Guide (Jeffrey Richter著)(中译本:基峰 李书良译 侯俊杰总监 Windows95程式设计指南)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值