VB 钩子的实现

转载 2006年06月18日 18:38:00
先从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 所有线程的菜单滚动条、对话框消息 系统

VB 用全局钩子,记录鼠标点击次数

首先用建立一个标准Exe程序把窗体名称,设定为frmMain在窗体上建立一组文本框数组,名称为txtMsgtxtMsg(0) -- 显示鼠标左键按下的次数txtMsg(1) -- 显示鼠标中键按下的次...
  • lbuskeep
  • lbuskeep
  • 2011年06月17日 18:42
  • 2460

VB实现钩子

 Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows 系统中的消息进行拦截、监视、处理。这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功...
  • s_ongfei
  • s_ongfei
  • 2007年07月31日 14:34
  • 1034

vb钩子小试

本来是因为要做一个小软件,其中要实现的一部分是用鼠标来定位一个座标,那么也就是说本身窗体的焦点可能会离开,就不能使用form的mousedown事件了,那么,使用钩子是可以实现的。基本想法就是,用钩子...
  • shenghu123
  • shenghu123
  • 2008年04月15日 22:34
  • 396

vb Hook比较详细的讲解 ---> vb获取按键消息(钩子方式)

Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows 系统中的消息进行拦截、监视、处理。这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功能...
  • yuli1234147
  • yuli1234147
  • 2016年12月23日 22:31
  • 1932

VB HOOK(钩子)超级无敌详细用法(介绍)

转自  http://hi.baidu.com/ljl88900/home     hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程...
  • qinjueping
  • qinjueping
  • 2011年12月16日 11:46
  • 2130

VB 鼠标钩子实例

此程序演示了在VB中怎么使用鼠标钩子。程序会把按钮覆盖到“开始 ”按钮上,当你按这个按钮的时候会显示一个快捷菜单,并且这个菜单可以响应事件。frmMain.fmOption ExplicitPriva...
  • chenhui530
  • chenhui530
  • 2008年01月21日 14:54
  • 4168

VB无所不能之三:VB截获Windows消息的钩子

本文地址:http://blog.csdn.net/useway 《Java程序员,上班那点事儿》——作者:钟声     VB一直被认为是一个可以通过简单的方法,完成Windows界面应用程序的一个语...
  • useway
  • useway
  • 2009年07月17日 19:12
  • 4091

钩子及其使用

钩子函数的用法和作用? http://topic.csdn.net/t/20020625/10/827891.html WINDOW的消息处理机制为了能在应用程序中监控系统的各种事件消息,...
  • zhouhao094
  • zhouhao094
  • 2015年07月18日 11:10
  • 509

VB 钩子

今天来学习VB的钩子: 本来是因为要做一个小软件,其中要实现的一部分是用鼠标来定位一个座标,那么也就是说本身窗体的焦点可能会离开,就不能使用form的mousedown事件了,那么,使用钩子是可以实...
  • AwillAway
  • AwillAway
  • 2011年08月29日 18:08
  • 545

CBT钩子实现解决程序间的冲突

可能在运行一个程序A时,将运行的程序与正在运行的某个程序B冲突。下面用一个CBT钩子实现当一个程序A启动时,关闭与本程序冲突的其它程序B。1、  首先写一个动态链接库CBTHooks。它实现一个全局C...
  • lion_wing
  • lion_wing
  • 2007年01月09日 22:13
  • 1436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB 钩子的实现
举报原因:
原因补充:

(最多只允许输入30个字)