VB编程中钩子的实现及应用
来源:互联网 发布:matlab转c语言后出问题 编辑:程序博客网 时间:2024/04/27 15:51
Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows 系统中的消息进行拦截、监视、处理。这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功能的软件。本文针对这个专题进行了探讨,希望可以为读者朋友们起到抛砖引玉的作用。 |
消息类型常量标识 | 值 | 消息类型 | 适用范围 |
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编程中钩子的实现
(一)钩子函数(HOOK Function)的格式。Hook Function实际上是一个函数,如果是系统钩子,该函数必须放在动态链接库中。该函数有一定的参数格式,在VB中如下:
Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long |
其中,nCode代表是什么情况之下所产生的钩子,随钩子的不同而有不同组的可能值;参数wParam,lParam传回值包括了所监视到的消息内容,它随Hook所监视消息的种类和nCode的值不同而不同。对于用VB所设置的钩子函数,一般的框架形式如下:
Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long |
函数的传回值,如果消息要被处理,则传0,否则传1,吃掉消息。
(二)钩子的安装及执行。钩子的安装要用到几个API函数:可以使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。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值为它处理的消息类型;lpfn值为钩子子程序的地址指针。如果dwThreadId参数为0或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。除此以外,lpfn可以指向当前进程的一段钩子子程代码。hMod值为应用程序的句柄,标识包含lpfn所指的子程的DLL。如果dwThreadId标识当前进程创建的一个线程,而且子程代码位于当前进程,hMod必须为0。dwThreadId值为与安装的钩子子程相关联的线程的标识符,如果为0,钩子子程与所有的线程关联。钩子安装成功则返回钩子子程的句柄,失败返回0。
另外,一般应在钩子子程中调用CallNextHookEx()函数以执行钩子链表所指的下一个钩子子程,否则安装了别的钩子的应用程序就会收不到钩子通知,从而产生错误的结果。CallNextHookEx()函数的声明如下:
Declare Function CallNextHookEx Lib"user32" Alias "CallNextHookEx"(ByVal hHook As Long,ByVal ncode As Lonog, ByVal wParam As Long,lParam As Any)As Long |
hHook值是SetWindowsHookEx()的传回值,nCode、wParam、lParam则是Hook函数中的三个参数。在程序终止之前,必须调用UnhookWindowsHookEx()函数释放与钩子关联的系统资源。UnhookWindowsEx()函数声明如下:
Declare Function Unhook WindowsHookEx Lib "user32" Alias "Unhook WindowsHookEx(ByVal hHook As Long)As Long |
hHook为安装钩子时的返回值,即钩子子程的句柄。
(三)VB中钩子安装应注意的问题。lpfn参数是一个HookFunc的地址,VB规定必须将HookFunc代码放到标准的.BAS模块中,并以"Address Of HookFunc"传入,而不可以将其放到类模块中,也不能将其附加到窗体上。而对于RemoteHook来说,HookFunc应包含在动态链接库中,因此如果在VB中使用RemoteHook,则还要用到GetModuleHandle()、GetProcAddress()两个API函数,它们的声明如下:
Declare Function GetModuleHandle Lib"kernel32" Alias "GetModuleHandleA"(ByVal lpModuleName As String)As Long |
hmod值是含钩子过程的模块名柄,如果是LocalHook,该值可以是Null(VB中传0),而如果是RemoteHook,则可以使用GetModuleHandle("名称.dll")来传入。
三、实例--键盘消息的拦截
在程序开发时常用的有对输入消息进行监视的键盘钩子,对于所监视到的消息应进行处理,下面对键盘钩子参数的具体内容组成进行说明:
如果有键盘消息(WM_KEYUP或WM_KEYDOWN)将被处理时,则系统调用键盘钩子。
nCode为HC_ACTION或HC_NOREMOVE,若小于0,则要求处理函数向下传递该消息。
wParam表示按键键码常数,A键到Z键与其ASCII码的相应值'A'到'Z'是一致的,例如按C键,则wParam值为67。
lParam与WM_KEYDOWN同,占四个字节,其包括的内容较多,其二进制结构如下:
0 | 1 | …… | 15 | 16 | ……… | 23 | 24 | 25 | …… | 28 | 29 | 30 | 31 |
0-15位(Key repeat count),键码重复次数。16-23位(Scan code),按键的扫描码。24位(Extended_Key flag),扩展键(功能键、数字小键盘上的键)标志,为1则是扩展键,否则为0。25-28位被保留。29位(Context Code),状态描述码,ALT键被按下则为1,否则为0。30位(Previouskey_stateflag)指定先前的键状态,如果消息被发出之前键处于按下状态,则为1;键处于释放状态则为0。31位(Transiton_stateflag)状态转换标志,如果键是被按下值为1,如果键被放开值为0。
本例中的钩子用来监视并记录应用程序中的按键信息。在程序中,ALT+F4组合键被屏蔽。下面是部分代码:
Public hHook as Long |
四、总结
钩子处理程序是Windows高级编程技术,一般程序员都使用VC++等程序设计工具实现,本文表明,对于VB来说,虽然很多人认为是非专业的设计工具,但实现钩子这样的高级技术也是非常方便的。另外在使用钩子时应注意到,钩子虽然功能比较强,但如果使用不当将会严重影响系统的效率,所以要尽量避免使用系统钩子,并且在不用钩子时,应将钩子及时卸载。
- VB编程中钩子的实现及应用
- VB编程中钩子的实现及应用
- VB 钩子的实现
- VC#钩子实现及应用
- VB高级钩子编程
- VB实现钩子
- 纯C#钩子实现及应用
- 纯C#钩子实现及应用
- 非Access数据库在VB的编程及应用
- Windows的钩子实现与应用
- VB中WinSock控件的属性、方法、事件及应用
- VB中WinSock控件的属性、方法、事件及应用
- VB中WinSock控件的属性、方法、事件及应用
- VB中WinSock控件的属性、方法、事件及应用
- 浅谈windows编程中钩子的使用
- VB中多窗口间的关系及编程
- 浅谈VB编程中网格控件的选用及使用方法
- WPF毫秒级桌面时钟的实现-C#中Hook(钩子)的应用
- 办公室局域网深藏不露之小技巧二三
- 这次考试全过了
- 简单的Windows API程序结构
- VO&TO&BO
- 凯撒加密算法C语言实现
- VB编程中钩子的实现及应用
- Oracle PL/SQL语言初级教程
- 面向对象的思维方法
- 成长中必须知道的20个故事【转载】
- 注册表API说明
- BCB中 time_t 和 TDateTime之间的相互转换
- const用法
- 存储过程编写经验和优化措施(转)
- COM中的几种字符串类型的总结