VB.net中HOOK的应用(一)

** VB.net ** ** 中 ** ** HOOK ** ** 的应用(一) **


在 vb.net 版做版主有一阵子了,一直在思考怎么能更好地帮助大家理解 vb.net 的新概念与编程方法。小小的回贴很难说清楚很多问题,所以利用一下文档中心这片广阔的天地,进行更深入的探讨。本人水平有限,不免错误与遗漏多多,请朋友们批评指正。

基本的想法是,写一系列的文章,讲解一下 vb.net 与 vb 的区别, vb.net 中的新概念, vb.net 控件的使用, vb.net 解决问题的新方法。如果时间允许,我希望自己能快快开展这个工作。更重要的是网友们的支持与鼓励会是我继续的源动力。

今天是第一次写,不知道从哪开始,权衡再三,决定从 API 调用问题开始入手。 Vb 的爱好者经常给我写信或发贴,询问 vb.net 中 API 的变化,那么今天我们就一起来探讨一下。虽然微软推出 vs.net 的目的是要用于跨平台,那么 Windows API 是不被推荐使用的,但从此入手,能让我们更方便地理解 vb.net 所做的改变,所以:

Let’s GO ………………………………………………

本文不是讲解 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 函数中写的代码了。

( 未完待续 )

Published At
Categories with Web编程
Tagged with
comments powered by Disqus