要立即了解VB钩子,
最初,这是因为我们想要制作一个小型软件,其中一部分是使用鼠标来定位坐标。也就是说,表单本身的焦点可能会离开,并且无法使用表单的mousedown事件。然后,可以使用钩子。基本思想是使用钩子获取鼠标单击消息,然后记录光标的坐标。挂钩分为线程挂钩和系统挂钩。线程挂钩只能挂钩来自该线程的消息,而系统挂钩可以挂钩系统中的所有消息。 VB只能实现线程钩子。即使线程钩子似乎可以在鼠标上操作,它们也不会成功! !
学习总是由问题引起的。也许问题很简单,但是如果我设法找到答案,我一定会得到回报,对吗?哈哈。
第一步:创建一个钩子。以我的理解,实际上是使用API函数将回调函数的地址添加到挂钩队列中。当然,这个队列可能只有一个钩子。然后,当发生硬件中断或软中断时,操作系统将在处理消息时处理此挂钩,并选择一个应用程序函数来处理它。 vb的hook函数放置在一个模块中,在进行确认时使用public,也就是说,在moulde中,哈哈,我不知道是否有任何错误。好吧,如果您想创建一个钩子,请使用它
公共声明函数SetWindowsHookEx Lib“ user32”别名“ SetWindowsHookExA”(ByVal idHook长,ByVal lpfn长,ByVal hmod长,ByVal dwThreadId长)
此API函数。在此括号中,几个参数的含义非常简单:
公共声明函数SetWindowsHookEx库“ user32”别名“ SetWindowsHookExA”
(ByVal idHook As Long,我想是钩子的ID。(要安装的钩子类型,较简单的是您要拦截的消息类型,是键盘还是鼠标...如果它是键盘挂钩,则为:WH_KEYBOARD或直接写由常量表示的值)
ByVal lpfn As Long,代表一个地址:注意:如果dwThreadId参数为0或另一个进程创建的线程的ID,则lpfn必须指向DLL中的钩子过程,这意味着这是一个系统钩 。它属于VB中的线程挂钩,因此请使用
以这种方式调用钩子程序名称的地址
ByVal hmod为Long,表示.DLL的hInstance。如果是Local Hook,则值可以为Null(可以在VB中传递0),如果是Remote Hook,则可以使用GetModuleHandle(“。dll name”)进行传递,这意味着我们应该设置在VB中为0
ByVal dwThreadId As Long dwThreadId值是与已安装的挂钩过程关联的线程的标识符。如果为0,则挂钩过程与所有线程相关联。在VB中,我们将其设置为App.ThreadId
第2步:编写钩子函数,即钩子钩住消息时要运行的函数
公共函数MyKBHook(ByVal nCode长,ByVal wParam长,ByVal lParam长)
如果nCode> = 0那么
MsgBox“您按下了按键”
如果结束
结束功能
每个人都可以理解此功能。函数的名称从其自身开始。我想将其用作键盘挂钩。只要钩子位于前面,就将其包括在内
挂钩ID被分配给常数WH_KEYBOARD,并且此处的函数名称被赋予lpfn,以使该挂钩函数成为键盘挂钩函数。
参数介绍如下:
nCode:此参数根据不同的钩子产生不同的值。
wParam,lParam包含截获的消息内容,它也与hook的类型和nCode的值不同。例如,在键盘挂钩(KeyBoard)中,wParam是键的返回码。
第三步是了解其他两个API函数:
([1) CallNextHookEX调用下一个钩子,并将消息传递到下一个钩子程序
声明:公开声明函数CallNextHookEx Lib“ user3 2. dll”(ByVal hHook为长,ByVal nCode为长,ByVal wParam为
长,lparam任意)
参数说明:

hHook,SetWindowsHookEX的返回值
nCode,wParam和lparam只是其三个参数,并且具体功能并不明显。使用时,您可以直接填写这三个形式参数。
为什么要有此CallNextHookEx函数?其实原因很简单。假设系统中有两个程序:程序A和程序B,首先A安装了一个键盘钩子,然后他编写了钩子函数,一切都完成了,等待有人按下键盘,然后他可以响应。然后B赶紧过去。他还安装了一个键盘挂钩,系统自然将它们排队。不幸的是,后面的B排在A的前面,也就是说,当按下键盘时,B的挂钩被激活了。在处理了钩子功能之后,他拍了拍屁股,然后离开,A只能看透秋天的水。 。为了解决这个问题,每个人都需要共同努力。你如何工作的?也就是说,所有钩子函数后面都有一个CallNextHookEx,以调用等待该消息的相同类型的下一个钩子。当然,除非您希望阻止将此消息传递给其他人,否则您不需要CallNextHookEx。 。 。
([2) UNHookWindowsHookEX:释放钩子
声明:私有声明函数UnhookWindowsHookEx Lib“ user3 2. dll”(ByVal hHook一样长)
参数说明:
hHook,要释放的钩子的名称
释放挂钩之后,系统资源可能无法成功释放。目前正在使用中
set hook =没有任何东西可以完全释放系统资源。
该钩子像一台全方位摄像机。当然,它占用了大量资源,因此在不需要时必须将其删除。
第四步是编写最简单的钩子
(1)打开VB,创建一个新窗口,添加要编写的公共模块
公共声明函数SetWindowsHookEx Lib“ user32”别名“ SetWindowsHookExA”(ByVal idHook长,ByVal lpfn长,ByVal hmod长,ByVal dwThreadId长)
公共声明函数UnhookWindowsHookEx Lib“ user32”(ByVal hHook As Long)只要
公共建筑WH_KEYBOARD = 2
公共挂机
公共函数MyKBHook(ByVal nCode长,ByVal wParam长,ByVal lParam长)
如果nCode> = 0那么
MsgBox“您按下了按键”
如果结束
结束功能
([2)查找窗口代码窗口并编写:
私人子Form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD,AddressOf MyKBHook,0,App.ThreadID)
结束子
私人子表格_卸载(取消为整数)
UnhookWindowsHookEx hHook

结束子
退出时,必须使用表单右上角的叉号关闭此简单的钩子,并且您不能使用VB调试来停止闭合,否则钩子仍然处于打开状态。函数MyKBHook可以看作是一个带有返回值的函数,我们可以将其更改为:
公共函数MyKBHook(ByVal nCode长,ByVal wParam长,ByVal lParam长)
如果nCode> = 0那么
MsgBox“您按下了按键”
如果wParam = 115 And(lParam And&H2000000 0) 0然后
if(lParam And&HC00000 0) = 0那么是否要执行ALT + F4操作
MsgBox“您按了ALT + F4”
MyKBHook = 1
退出函数'退出,表示以下CallNextHookEx函数不再运行且消息已被占用,也称为阻止
其他
MyKBHook = 0
如果结束
如果结束
呼叫CallNextHookEx(hHook,nCode,wParam,lParam)
结束功能
这有点严格,带有附加的返回值,我们可以根据此返回值判断是否处理它以及如何处理它。还有CallNextHookEx,它将消息传递到下一个钩子。
到目前为止,只能执行键盘挂钩。现在列出了接受的鼠标挂钩示例。
(在1)模块中输入:
公共常量WM_MOUSEMOVE =&H200
公共建筑WM_LBUTTONDOWN =&H201
公共建筑WM_LBUTTONUP =&H202
公共常量WM_LBUTTONDBLCLK =&H203
公共常量WM_RBUTTONDOWN =&H204
公共常量WM_RBUTTONUP =&H205
公共常量WM_RBUTTONDBLCLK =&H206
公共常量WM_MBUTTONDOWN =&H207

公共常量WM_MBUTTONUP =&H208
公共常量WM_MBUTTONDBLCLK =&H209
公共常量WM_MOUSEACTIVATE =&H21
公共常量WM_MOUSEFIRST =&H200
公共常量WM_MOUSELAST =&H209
公共常量WM_MOUSEWHEEL =&H20A'上面是鼠标的值
私有声明函数CallNextHookEx Lib“ user32”(ByVal hHook长,ByVal nCode长,ByVal wParam长,lparam任何长)
公共函数HookProc(ByVal nCode长,ByVal wParam长,ByVal lparam长)
如果是nCode
HookProc = CallNextHookEx(hHook,nCode,wParam,lparam)
退出功能
如果结束
如果wParam = WM_RBUTTONDOWN那么
MsgBox“ aa”
如果结束
结束功能
(以2)的形式输入:
私有声明函数SetWindowsHookEx Lib“ user32”别名“ SetWindowsHookExA”(ByVal idHook长,ByVal lpfn长,ByVal hmod长,ByVal dwThreadId长)
私有声明函数UnhookWindowsHookEx Lib“ user32”(ByVal hHook As Long)只要
私有const WH_MOUSE_LL只要= 14
私人子Form_Load()
hHook = SetWindowsHookEx(WH_MOUSE_LL,HookProc的地址,App.hInstance,0)
结束子
私人子表格_卸载(取消为整数)
呼叫UnhookWindowsHookEx(hHook)
结束子
在此示例中,右键单击鼠标会弹出msg a
注意:本文引用了Internet上的一些流行观点。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-369290-1.html
1更不敢更了
马云就是废话太多
钻进那条缝