Hook

 
本文不是讲解Hook原理的文章,仅是讨论一下在vb.net如何调用Hook功能,以及vb.net中API使用的变化问题。
由于Hook种类较多,本文中以最常用的键盘Hook为例进行分析。
一、先来看一下在vb中是如何实现的。截的是空格键。表现的目标是:一个form,上面有一个textbox,不管焦点是否落在textbox里,按空格键,不会在textbox中输入一个空格,而是变成在textbox中写入一句话:“HOOK成功!”
1.在一个Module中写入下列代码:
调用的API的申明:
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
函数说明:本函数是用于启动Hook设置。
idHook是Hook的类型,即处理的消息类型。
Lpfn是Hook子程(函数或过程)的地址指针。如果dwThreadId参数为0或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的Hook子程。除此以外,lpfn可以指向当前进程的一段Hook子程代码(我们利用的就是这个性质)。
hMod是应用程序实例的句柄,标识包含lpfn所指的子程的DLL。如果dwThreadId 标识当前进程创建的一个线程,而且子程代码位于当前进程,hMod必须为NULL。
dwThreadId是与安装Hook子程相关联的线程的标识符,如果为0,Hook子程与所有的线程关联。 返回值:函数成功则返回Hook子程的句柄,失败返回NULL。
 
Declare Function UnHookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
函数说明:    本函数是解除Hook之用。hHook是Hook函数的句柄。
 
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
函数说明:本函数的作用是将当前Hook链中的Hook信息传递给下一个Hook。
hHook是当前Hook的句柄,一个应用程序接收这个句柄,作为先前调用SetWindowsHookEx函数的结果。
nCode指的是传递到当前Hook过程的Hook代码,下一个Hook过程使用这段代码去决定如何处理Hook信息。
wParam指传递给当前Hook过程的wParam值,它的具体含义是由当前Hook链中的相关Hook的类型决定的。
lParam指传递给当前Hook过程的lParam值,它的具体含义是由当前Hook链中的相关Hook的类型决定的。
 
2. 定义的常量是:
Public hnextHookproc As Long
Public Const WH_KEYBOARD = 2   这个是表明 Hook 的种类是键盘 Hook
Public Const PM_KEY_SPACE = &H20   空格键
 
3.代码段
Public Sub UnHookKBD()    解键盘 HOOK 函数
    If hnextHookproc <> 0 Then
       UnHookWindowsHookEx hnextHookproc
       hnextHookproc = 0
    End If
End Sub
 
Public Function EnableKBDHook()   设置键盘 HOOK
    If hnextHookproc <> 0 Then
       Exit Function
    End If
    hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
                MyKBHFunc, App.hInstance, 0)
    If hnextHookproc <> 0 Then
       EnableKBDHook = hnextHookproc
    End If
End Function
 
Public Function MyKBHFunc(ByVal iCode As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
  MyKBHFunc = 0
   If iCode < 0 Then
    MyKBHFunc = CallNextHookEx(hnextHookproc, iCode, wParam, lParam)
    Exit Function
 End If
If wParam = PM_KEY_SPACE Then '' 偵測 有沒有按到空格鍵
      MyKBHFunc = 1
       ‘ 加入自己的代码,用于表明响应
     form1.text1.text=”Hook 成功!
   End If
End Function
4.在Form中的代码很简单:
Private Sub Form_Load()
    Call EnableKBDHook
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
   Call UnHookKBD
End Sub
现在在 form 窗体状态下,敲空格键,就会响应你在 MyKBHFunc 函数中写的代码了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值