VB 钩子的实现

先从Api说起:
SetWindowsEx:安装一个钩子
  声明:Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal

lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  参数说明:
  idhook,要安装的钩子类型,简单点就是你要拦截的消息类型,是键盘呢?还是鼠标……如是键盘钩子则为:WH_KEYBOARD。
  lpfn,钩子子程序的地址,在VB中可以使用 Adress of 钩子子程序名 来呼叫。
  hmod,这个参数可以设置为0,它用于全局的钩子。
  dwThreadId,线程标识符,在VB中,如果设置为0的话则你安装的钩子与所有的进程关联。
  这个函数有个传回值,传回值是当前钩子的句柄。

  钩子的使用会加重系统处理的负担,所以在不用钩子的时候尽量将去除钩子,释放钩子资源,在要用到的时候在调用。那么我们怎么来释

放钩子呢?看函数

UnHookWindowsHookEx:释放一个钩子
  声明:Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
  参数说明:
  hHook,欲释放的那个钩子名
  释放了钩子后,系统的资源并不一定就成功释放完毕了,这个时候在用
set 钩子=nothing 可以完全释放系统资源了。
  安装了钩子另外要注意一个问题,就是你安装了钩子后,其它的程序可能收不到消息,因为当你拦截消息后,并没有将消息传递个别的钩

子,只是自己在内部处理了。所以还要用到一个函数:

CallNextHookEx   呼叫下个钩子,将消息传递个下个钩子程序
  声明:Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As

Long, lparam As Any) As Long
  参数说明:
  hHook,SetWindowsHookEx的传回值
  nCode,wParam,lparam只是它的三个参数而已,具体的作用并不明显。使用的时候可以直接填写这个三个形参。

  具体的安装释放,呼叫都已经讲完了。下面轮到具体的钩子处理过程了,这个处理的过程完全由自己写,具体如何看你的心情了,不过还

是有些地方需要说说的。在写处理过程的时候,子程序框架一定要这样写:
  Private Function Hookname(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long
  处理过程……
  end Function
  在这个子程序中,Hookname 是钩子的名字,随你开心写个名字即可(但要符合VB命名规范哦)。其中有几个参数我来给大家解释一下
  参数:
  nCode:这个参数按照钩子不同产生不同的值。
  wParam,lParam 包含了拦截到的消息内容,同样它也与Hook的种类和nCode的值不同而不同。比如在键盘钩子(KeyBoard)中,wParam则

是按键返回码。
  对了,这个子程序是有传回值的,这个传回值决定你如何处理这个消息。
  下面就来写一个具体的钩子来实现消息的拦截,这个程序将在你按下Shift+S的时候弹出对话框提醒你~!
  如果有看不懂的地方,就回来找找答案,可以说下面的代码这里都有解说了(我还加了注释~~!!!)。


'以下代码放在一个标准的模块之中,一定要是标准的模块~!(VB规定的,没办法……)

Public Const WH_KEYBOARD = 2   'WH_KEYBOARD,这是必须的,因为下一步我们要用到它安装键盘钩子,WH_KEYBOARD属于常量。
Public Const VK_SHIFT = &H10   'VK_SHIFT,下面用它判断SHIFT

Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any)

As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
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
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
'以上属于我们要用到的Api声明

Public hHook As Long '定义一个类型为长整形的全局变量 hHook,我们用这个变量来存储钩子的句柄

Public Function Keyhook(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '钩子的处理过程,Keyhook为钩

子名,可以自己随便定义
  If idHook < 0 Then '如果idHook的值小于0,也就是说没有产生键盘消息
    KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam) '那么就呼叫下一个钩子
  Else
    If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then '当按下Shift+S时则进行如下处理
        Msgbox "你按下了Shift+S~!"   '使用Msgbox弹出提示框,提示"你按下了Shift+S~!"
    End If   '结束if语句
  KeyHook = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)   '呼叫下个钩子
  End If
End Function '结束过程

'以下代码放在窗体中

Private Sub Form_Load() '当窗体被读取时产生
  hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf Keyhook, App.hInstance, App.ThreadID) '用SetWindowsHookEx安装一个键盘钩

子钩子
End Sub
Private Sub Form_Unload(Cancel As Integer)
  UnhookWindowsHookEx hHook      '使用UnhookWindowsHookEx卸载一个钩子,hHook为钩子的句柄
End Sub

   哈哈,最简单的Hook使用了,可以用在快捷键里,不过大家运行的时候有没有发现呢?每次你按下SHIFT+S的时候至少会弹出2个对话

框呢?为什么呢?因为我们安装的是是KeyBoard键盘事件对吧?但它不是代表着按下事件(KeyDown),而在上面的代码中我们写的很清楚

了,当产生键盘事件(Shift+S)的时候弹出对话框,我们没有具体规定是什么键盘事件(键盘事件很多,常见的有KeyDown,KeyUp,K

eyPress……),当你按一次Shift+S的时候是会产生至少2个键盘事件的,及KeyDown(按下)和KeyUp(释放,也是是松开),所以当

然会显示至少2个对话矿喽~!针对这样的问题怎么处理呢?很简单,定义一个Hook的KeyDown事件不就行了?另外,这个钩子程序不是全

局钩子,所以当窗体不处于激活状态(窗体标题栏为蓝色)时钩子无法拦截键盘消息的。
   针对上面的问题以及全局钩子的方法就等我下次把全局钩子帖出来在说了,好了,累了,游戏中……^_^(什么时候我的大号 枫风叶子 搞定问题后我在贴~!55555)
  
附赠送钩子的常量:
消息类型常量标识 值 消息类型 适用范围
WH_CALLWNDPROC 4 发给窗口的消息 线程或系统
WH_CALLWNDPROCRET 12 窗口返回的消息 线程或系统
WH_CBT 5 窗口变化、焦点设定等消息 线程或系统
WH_DEBUG 9 是否执行其它Hook的Hook 线程或系统
WH_FOREGROUNDIDLE 11 前台程序空闲 线程或系统
WH_GETMESSAGE 3 投放至消息队列中的消息 线程或系统
WH_JOURNALPLAYBACK 1 将所记载的消息进行回放 系统
WH_JOURNALRECORD 0 监视并记录输入消息 系统
WH_KEYBOARD 2 键盘消息 线程或系统
WH_MOUSE 7 鼠标消息 线程或系统
WH_MSGFILTER -1 菜单滚动条、对话框消息 线程或系统
WH_SHELL 10 外壳程序的消息 线程或系统
WH_SYSMSGFILTER 6 所有线程的菜单滚动条、对话框消息 系统
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值