VB 钩子详解
简单易学 图文并茂 VB系统钩子与快捷键开发
简单易学图文并茂
系统钩子与快捷键开发
创意和设计目标
我喜欢将新建目录或者文件以日期打头,这样很方便排序和查找。如下图:
但每次新建目录后,都要手动输入日期。这很不方便。于是想到用快捷键了输入这个日期的创意。目标是每当新建目录或文件后,按下F5键,自动插入当前日期。
为实现这个功能,可使用VB的Sends函数。但因为需要程序在后台运行,因此打算把程序图标放到右下角的托盘中。并且,因为它在按下F5键后执行,因此需要从系统中把按键信息捕捉出来,这就要用到系统钩子。
第一步创建一个Windows应用程序
因为未来的程序在后台运行,因此它不需要任何界面。这里把程序默认创建的Form的透明度设为0,把Border设为None,ControlBox设为0,ShowInTaskBar设为0。这样它就不会在系统底部的状态栏出现了。
在Form上添加一个NotifyIcon,并指定一个喜欢的图标,这样程序在运行的时候,在右下角的托盘会出现一个图标。
之后,可以再加入一个ContextMenuStrip控件,并把它指定给NotifyIcon,这样右键点击图标的时候可以跳出控制菜单。
为方便调试,我在弹出目录中制作了两个功能,一个是显示和隐藏窗口,这个功能可为今后扩展用;一个是关闭功能,点击它可以关闭这个后台程序。这两个功能不是我们的重点,这里只把代码贴出来。
***************************************************
‘这个程序改变窗口的透明度,则窗口可以在桌面上显示和隐藏
Private Sub changeShoe(ByVal sender As System.Object, ByVal e As KeyEventArgs)
基于VB的键盘钩子算法的实现
o OENC PTRo MDR O UE 29 M 0
.
1 2
其 余 原 理 相 同
C s 7 P it X a e9 : r T T n 1 键
C s 5PitXT ae6 :r T n
C s 4 P it XT a e4 : r T n
, A键
"R N C E P I T S RE N键
2 键 盘 模 块 ( 2 . 3 图 )
机 息 . 可以强制结 束消息 的传递 。 还 总 2 键 盘 钩 子 的 工作 原 理 第
三
一
3 键 盘 钩 子 实现 算 法
使 用 不 同 的 W idw P 函 数 获 取 键 盘 的 动 作 n o sA I
空 格 键 等 操 作 信 息 。 捷 键 具 有 操 作 简单 、 便 、 捷 快 方 快 等优 点 . 就 需 要 我 们 在 编 写 程 序 代 码 的 过 程 中增 加 这 对 键 盘 的 按 键 进 行 判 断 . 个 过 程 就 是 所 谓 的 键 盘 钩 这 子 功 能 利 用 V 在 B来 编 写 所 需 要 的 应 用 程 序 时 . 于 由 V B无 法 直 接 对 系 统 的 注 册 表 进 行 操 作 对 于 此 类 操
盘操作 安全性 的提 高和警 惕。
பைடு நூலகம்
关 键 词 : sa Bac W id ws I 键 盘 钩 子 Vi l s ; n o ; u i AP
VB_HOOK_使用详解
VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。
关于HOOKS
使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链
WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)
HOOK过程
为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK 链中安装你自己的HOOK函数。该函数语法如下:
public function MyHook(nCode,wParam,iParam) as long
‘加入代码
end function
其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
VB键盘钩子源码:截取一切键盘按键
VB键盘钩子源码:截取一切键盘按键
(2011-07-15 10:52:11)
转载▼
分类:我的VB
标签:
杂谈
1、UI设计:
2、程序源码:
(1)FrmHook源码
Option Explicit
Dim WithEvents Hook As ClsHook '创建一个需要事件支持的Hook为模块ClsHook
Private Declare Function MapVirtualKeyEx Lib "user32" Alias "MapVirtualKeyExA" (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long) As Long
'根据指定的映射类型,执行不同的扫描码和字符转换
'
' uCode Long,欲转换的源字符或代码
' uMapType Long,控制映射类型,如下所示
' 0 —— uCode是个虚拟键码?函数返回相应的扫描码
' 1 —— uCode是个扫描码?函数返回相应的虚拟键码
' 2—— uCode是个虚拟键码。函数返回相应的ASCII值(未加Shift组合键)。针对死键,高位设为1。如果出错,返回NULL
' dwhkl Long,键盘布局的句柄
Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
'取得一个句柄,描述指定应用程序的键盘布局
' dwLayout ,//欲检查的线程的标识符
vB全局Hook鼠标钩子
VB 全局Hook鼠标钩子,获取鼠标单击左键、鼠标
坐标位置等。
以下是鼠标的按键消息:
form:
VBScript code复制代码
Private Sub Form_Load()
HooK
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHooK
End Sub
Module:
VBScript code复制代码
Private Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private 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
Private Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
用VB实现的全局键盘钩子
用VB实现的全局键盘钩子
2010-04-06 13:30
代码功能:实时监测Caps Lock、NumLock、Scroll Lock三个按件的状态,并显示在Label1 Label2 Label3三个标签中
'.bas模块中
Public m_hDllKbdHook As Long 'public variable holding
'the handle to the hook procedure
Public Const WH_KEYBOARD_LL As Long = 13 'enables monitoring of keyboard 'input events about to be posted 'in a thread input queue
Private Const HC_ACTION As Long = 0 'wParam and lParam parameters
'contain information about a
'keyboard message
Public Const VK_CAPITAL As Long = &H14
Public Const VK_NUMLOCK As Long = &H90
Public Const VK_SCROLL As Long = &H91
Private Const LLKHF_UP As Long = &H80& 'test the transition-state flag
Public Type KeyboardBytes
kbByte(0 To 255) As Byte
VB编程中使用钩子技术实现程序窗口监控
计算机与现代化
2009年第10期
J I S UANJ I Y U X I A NDA I HUA
总第170期
文章编号:100622475(2009)1020141203
收稿日期:2009204220
作者简介:潘景新(19752),男,广东韶关人,韶关学院计算机科学学院实验室主任,实验师,硕士,研究方向:计算机应用,网络信息系统。
VB 编程中使用钩子技术实现程序窗口监控
潘景新
(韶关学院计算机科学学院,广东韶关512005)
摘要:应用钩子技术可以监视W indows 系统的各种事件消息,对系统实施控制。本文介绍在VB 编程中使用AP I 函数创建系统钩子的方法,以及设计钩子函数实现对程序窗口监控。关键词:VB 编程;消息机制;钩子;程序窗口监控
中图分类号:TP311 文献标识码:A do i:10.3969/j .issn .100622475.2009.10.039
Rea li za ti on of Program W i n dow M on itor by Hook Technology i n VB Program
P AN J ing 2xin
(College of Computer Science,Shaoguan University,Shaoguan 512005,China )
Abstract:By using hook technol ogy,the event messages of W indows syste m can be monit ored and the syste m can be contr oled .This paper intr oduces how t o use AP I functi on in VB p r ogra m ing t o set up hook,and realizes p r ogram window monit or by desig 2ning the hook functi on .
钩子技术原理
钩子技术原理
钩子技术(Hooking)是一种在计算机编程中常用的技术,它允许开发者拦截和修改特定的操作或事件。钩子技术的原理是通过在操作系统或应用程序中插入特定的代码段(钩子函数),以便在特定事件发生时执行自定义的操作。
以下是钩子技术的一般原理:
钩子注册:开发者通过调用操作系统提供的API函数,将自定义的钩子函数注册到目标操作系统或应用程序中。这些API函数通常提供了不同类型的钩子,如键盘钩子、鼠标钩子、消息钩子等。
事件拦截:一旦钩子函数被注册,它将被插入到操作系统或应用程序的事件处理流程中。当特定的事件发生时,操作系统或应用程序将调用已注册的钩子函数。
自定义操作:在钩子函数中,开发者可以执行自定义的操作。这可以包括修改事件的参数、拦截和修改事件的处理流程、记录事件信息、发送自定义的消息等。
钩子链:在某些情况下,多个钩子函数可以被注册,并形成一个钩子链。当事件发生时,钩子链中的每个钩子函数都会被依次调用,允许开发者在不同的层次上进行操作。
需要注意的是,钩子技术是一种强大的编程技术,但也需要谨慎使用。滥用钩子技术可能会导致系统不稳定、安全漏洞或不可预测的行为。因此,在使用钩子技术时,开发者应该遵循最佳实践,并确保对目标系统或应用程序的行为有充分的了解。
vb外挂HOOK终极解说
vb外挂之HOOK技术终极详细解说
阿祥(qq:475335620)
很多学习vb的人都想学习外挂及hook,我在网上也找到了一段程序,后台键盘记录外挂,其实网上大多数流传的HOOK代码都跟这段代码几乎一个出处。网上有关于这些代码的解释,但是关键部分根本就没解释,等于没说。
下面的程序解释得很详细。有的地方全属个人看法,不过还是值得一看。不对的地方欢迎大家指出。当然,高手勿笑。
插入一段。。。。(现在做软件都卖不到钱,比如外挂脚本交易平台,能赚钱的作者都是那几个,不是跟网站勾搭、就是确实很厉害的人,我就不信能写出“anjian精灵”的人找不到能编外挂的人。。。。所以,想拼命成为作者的人大多数都是浪费精力,成为了作者大多数都赚不到钱。不如写个开源的,还能促进社会进步,呵呵。。。。)好吧,正式我们的hook学习。
Hook并不神秘,它说到底就是通过调用API函数在消息队列中安装钩子,实现截获消息,处理消息的功能。在这里,我浅浅的讲讲windows的消息机制。比如,我们按键盘的某个键时,系统就会生成一个消息到系统的消息队列,系统再发送到应用程序消息队列中,windows有不同的消息队列。对于键盘钩子,是安装在系统的消息队
列中。
看程序:(以下程序在模块中,呵呵,工程-----添加模块)Option Explicit ‘强制性变量声明,不允许出现未声明的变量。呵呵,都懂!!
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
VB外挂之HOOK技术的最详细教程
vb外挂之HOOK技术终极详细解说
By:史上最大小强
很多学习vb的人都想学习外挂及hook,我在网上也找到了一段程序,后台键盘记录外挂,其实网上大多数流传的HOOK代码都跟这段代码几乎一个出处。网上有关于这些代码的解释,但是关键部分根本就没解释,等于没说。
下面的程序解释得很详细。有的地方全属个人看法,不过还是值得一看。不对的地方欢迎大家指出。当然,高手勿笑。
好吧,正式我们的hook学习。
Hook并不神秘,它说到底就是通过调用API函数在消息队列中安装钩子,实现截获消息,处理消息的功能。在这里,我浅浅的讲讲windows的消息机制。比如,我们按键盘的某个键时,系统就会生成一个消息到系统的消息队列,系统再发送到应用程序消息队列中,windows有不同的消息队列。对于键盘钩子,是安装在系统的消息队列中。
看程序:(以下程序在模块中,呵呵,工程-----添加模块)
Option Explicit ‘强制性变量声明,不允许出现未声明的变量。呵呵,都懂!!
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
‘Getkeystate是api函数,顾名思义,获取某个键的状态,参数nvirtkey就是某个键的虚拟键键码,不同的系统虚拟键码不同。比如vbkeycontrol或者vbkeyshift就可以作为参数。
返回值是16位的,如开关键打开,则位0设为1(开关键包括CapsLock,NumLock,ScrollLock);如某个键当时正处于按下状态,则位15为1;如已经抬起,则为0。数据在储存器中,最高位为1时是负数,为0时是正数。
VB中利用日志记录钩子实现键盘监控
开始监控
停止监控
清空记录
图 1 程序界面 2.2 程序代码
程序中日志记录钩子的安装和卸载可以分别使用 Win32API 函数 SetWindowsHookEx 和 UnhookWindowsHookEx 来实现。
首先需要在工程中新建一个标准模块,在标准模块中声
明一些程序用到的 API 函数、结构及常量,如下所示: Option Explicit Public 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
SOFTWARE DEVELOPMENT AND DESIGN
软件开发与设计
VB 中利用日志记录钩子实现键盘监控
孙建华,刘金龙
(中国矿业大学材料学院,徐州 221116)
摘 要: 利用钩子技术应用程序可以监视指定窗口的某种消息。介绍了 Windows 钩子的基本概念和类型,并在 Visual Basic 下,利用日志记录钩子编程实现了键盘监控功能。 关键词: VB; 日志记录钩子; 键盘监控
VB的钩子
VB的钩子:
本来是因为要做一个小软件,其中要实现的一部分是用鼠标来定位一个座标,那么也就是说本身窗体的焦点可能会离开,就不能使用form的mousedown事件了,那么,使用钩子是可以实现的。基本想法就是,用钩子获取鼠标点击消息,然后将光标所在的座标记录下来,钩子分为线程钩子和系统钩子。线程钩子只能钩取本线程的消息,而系统钩子能勾取系统中所有的消息。VB能实现的只是线程钩子。而且就算是线程钩子好像对鼠标的操作也不会成功!!
学习总是由问题引起的,可能这个问题很简单,但是我努力的去找答案一定会有收获对吗?呵呵。。
第一步:建立钩子。在我的理解,其实就是使用一个API函数,将一个回调函数的地址加入一个钩子队列中,当然可能这个队列只有一个钩子。那么当发生硬件中断或者软中断的时候,操作系统对这个消息处理的时候,就会照顾到这个钩子,选择一个应用程序的函数来处理它。vb 的钩子函数是放在一个模块中的,而且在申明的时候都是用public,即在moulde中,呵呵,不知道有没有写错。好了要想建立钩子,用的是
Public 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
这个API 函数。很简单看看这个括号里的几个参数的意义:
VB技巧全局键盘消息钩子
[VB技巧]全局键盘消息钩子
程序中的代码:
Private Sub Command1_Click()
hHook=Hook_安装钩子(WH_KEYBOARD_LL,AddressOf按键消息_自定义回调函数)'安装钩子
End Sub
Private Sub Command2_Click()
Call Hook_卸载钩子(hHook) '释放钩子
End Sub
模块中的代码:
'消息内容说明:
'
'消息包含的信息有nCode,wParam,lParam这3个,本例以键盘钩子为例. '
'nCode:
'当nCode等于HC_ACTION时,wParam和lParam包含鼠标信息. '当nCode等于HC_NOREMOVE时,wParam和lParam包含鼠标信息,并且鼠标消息没有从消息队列里移除
'wParam:
'包含内容为消息事件.例如本例中"WM_KEYDOWN"事件.在本例中是用来筛选出"WM_KEYDOWN"事件的消息.
'lParam:
'包含了消息的内容,是一个结构型数据(EVENTMSG).包含了消息的所有内容,具体请查看声明里的注释
'本hook为全局键盘hook,能hook所有键盘消息,而且是在系统处理消息前优先处理。(这个功能需要选择WH_KEYBOARD_LL这个钩子)
'如果不懂代码,只修改“按键消息_自定义回调函数”这个函数即可。切勿修改其他代码。
VB6全局键盘、鼠标钩子
VB6全局键盘、⿏标钩⼦
VB: èü?ì?¢êó±ê13×ó
'---------------------------------
'Form
'°2×°13×ó
Private sub AddHook()
'?ü?ì13×ó
lHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)
'êó±ê13×ó
lHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)
End Sub
'D?13×ó
Private sub DelHook()
UnhookWindowsHookEx lHook(0)
UnhookWindowsHookEx lHook(1)
End Sub
'---------------------------------
'?£?é
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
VB编程中应用全局钩子实现应用程序的一键隐藏与显示
V B编 程 中应 用全 局 钩 子 实现 应 用 程 序 的一 键 隐藏 与显 示
张 静
( 河套大学机 电与信息工程学院 ,巴彦淖尔 0 50 ) 10 0
摘 要 : 介 绍 了钩 子 的基 本 原 理及 分 类 、钩 子过 程 和 相 关 的 A I P 函数 ,以及 V B编程 中全 局 钩 子 的 使 用 方 法 ,同 时
到 对 其 的 控 制 权 。此 时 在 钩 子 函 数 中 就 可 以 对 截 获 的 消 息 进
的界 面 设 计 ,如 图 1 示 。界 面 中 的 列 表 框 中显 示 当前 内存 所 中运 行 的所 有 程 序 ,在 此 可 双 击 鼠标 选 择 要 隐 藏 的 程 序 ,在
行各种修改处理 ,甚至强行终止该消息的继续传递。
A b tac : sr t Th s a r nto uc d h b sc rncp e f t e oo , c a sfc to o h h o a d h r lt i p pe i r d e te a i p i il o h h k t he l sii ain f t e o k n t e eaed API
wih t e R e o e H o k Te hn l g n t t h m t o c o o y i he VB o r m m i Pr g a ng
[最新]vb6全局键盘、鼠标钩子
VB6全局键盘、鼠标钩子
VB: 全局键盘、鼠标钩子
'---------------------------------
'Form
'安装钩子
Private sub AddHook()
'键盘钩子
lHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)
'鼠标钩子
lHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)
End Sub
'卸钩子
Private sub DelHook()
UnhookWindowsHookEx lHook(0)
UnhookWindowsHookEx lHook(1)
End Sub
'---------------------------------
'模块
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows钩子函数的概念和实现方法
首先我们必须大致了解Windows的基本运作机理,Windows作为一个多任务操作系统,它是分有层次概念的,运行在最底下的称为Ring 0层,在这一层里基本上都是一些硬件驱动程序和Windows的总内核,一般的应用程序极少极少运行在这层,当然也有例外,例如调试软件SoftICE(不过基本上这个软件的作用是Crack软件而不是调试)、还原精灵还有分区魔法大师,就是运行在Ring 0层的,另外就是著名的CIH病毒。运行在Ring 0级的程序能够对所有硬件进行直接地址级访问,所受到的限制也最小。
消息(Message)传递是Windows独有的一种机制,因为Windows规定运行在Ring 0以上的程序是没有权利知道究竟硬件发生了怎样的中断变化的,Windows统一将这些中断变化封装成一系列的消息(黑箱作业,也就是常说的Black Box),比如鼠标移动,系统产生一个OnMouseMove消息(但这条消息从何而来,相关的硬件中断向量是什么,程序无从得知),OnMouseMove这条消息最后送达每一个窗口程序以供处理。在更高层次的地方,比如说控件级,所有的消息还被封装成一系列“事件”,比如TextBox控件有KeyPress事件,实际上,这些事件都是林林种种的消息映射。事件的概念使得程序员能够更加傻瓜化地进行编程,但是从另一个角度来说,这种黑箱作业也使得程序员过分依赖系统的安排,限制了程序员的思维,举个例子,Windows为按钮控件封装了大部分常用的属性和事件,完成一般的常规妈作是没有问题的,但是很遗憾,或许是Windows的疏忽,按钮控件的字体颜色永远默认是黑色,而且Windows没有为此提供一个专门的接口来修改,碰到这种情况,程序员就会非常头疼。
钩子函数(Hook Function),就像一把钩子,它的作用是将消息在抵达窗口程序之前先钩到一个地方以便程序员进行分析,这个地方称为挂接函数链,消息在这里先被一系列的函数处理然后由程序员决定是否交还给Windows系统,在这里,你可以“吞噬”(Lickup)一些你不希望发生的消息,比如说你吞掉所有的键盘消息而不交还给系统,那么键盘将会失灵。当然,经过了这道周折,系统效率将会有极其微小的降低,但是,由于Windows规定所有不运行在Ring 0层的程序都不能直接访问硬件中断,因此作为一种中断驱动程序的补充,钩子函数在很多场合下是非常有用的,有时候甚至是唯一的方法。
下面就以键盘拦截为例讲述钩子函数的使用方法:
首先定义以下API:
Public 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
SetWindowsHookEx,这个函数是一切钩子函数的根本,其作用是通知Windows进行钩子妈作并定义钩子函数。
参数1,idHook为定义需要进行的拦截类型,是键盘拦截?鼠标拦截?还是别的。如 WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。
参数2,lpfn为该挂接函数链的首地址指针,因为VB是没有指针这种数据类型的所以用Long 代替。lpfn为钩子函数,在 VB中可以使用 AddressOf 获得钩子函数的地址。这个函数因为钩子类型不同而有所不同。如键盘钩子为:
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
如果 Code 不为 0,钩子函数必须调用 CallNextHookEx,将消息传递给下面的钩子。 wParam 和 lParam不是按键。
参数3,hmod为创建钩子函数那个实体的句柄,即你的程序本身的句柄(handle),hmod用于全局钩子,VB要实现钩子,必须设为0。
(关于句柄:每一个程序都有一个ID号称为进程,句柄则分得更细,每一个进程里的每一个控件的ID号称为句柄。
比如一个程序既有输入框又有下拉条,那么下拉条和输入框都有自己的ID号,这个称为句柄。)
参数4,dwThreadId ,为监控代码,0表示全局监控,dwThreadId用于线程钩子 VB 中可以设置为 App.ThreadID。
UnhookWindowsHookEx 函数为释放钩子,将钩子函数所占用的资源交还给系统,起一个简单的清道夫功能。
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pDest As Any, _
pSource As Any, _
ByVal cb As Long)
CopyMemory 作用是将内存里的某一块数据pSource拷贝到另一个地址pDest。最后一个参数cb表示拷贝内容的字节大小。
Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
GetAsyncKeyState作用是获得各种辅助功能键的状态(如CTRL,SHIFT什么的)。
Private Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
CallNextHookEx 挂钩函数拦截了某条消息后,由CallNextHookEx决定是否将这些消息送还给Windows系统。
Private Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type
KBDLLHOOKSTRUCT为键盘钩子的结构体定义,关于该结构的成员,我没有从API函数帮助库里找到任何资源,不过大概猜也能猜出来。
成员1:vkCode为虚拟键码
成员2:scanCode为扫描码
成员3:flags为功能键状态
成员4:扩展信息?
实际上本例中我们只是需要简单的知道vkCode然后用chr函数置换成字符即可,所谓的vkCode实际上和ASCIIC码是一一对应的。
Private Const HC_ACTION = 0
Private Const LLKHF_EXTENDED = &H1
Private Const LLKHF_INJECTED = &H10
Private Const LLKHF_ALTDOWN = &H20
Private Const LLKHF_UP = &H80
Private Const WH_KEYBOARD_LL = 13&
Public Const VK_TAB = &H9
Public Const VK_CONTROL = &H11
Public Const VK_ESCAPE = &H1B
Public Const VK_DELETE = &H2E
以上10个定义为常量定义,常量定义没有什么特别好说的,仅仅是帮助记忆而已。你完全可以在使用VK_DELETE的地方使用&H2E,如果你觉得&H2E比VK_DELETE更容易理解