全局 Windows 钩子






4.80/5 (56投票s)
一个包含各种 Windows 钩子的单一组件
引言
WindowsHookLib
是一个用于系统范围内的鼠标、键盘和剪贴板挂钩的单一库。WindowsHookLib
库已重写为 C#,因此它使用通用语言运行时 (CLR)。这意味着该库可以被 .NET 中的各种项目引用。鼠标和键盘钩子是低级别的,因此您可以使用 MouseEventArgs
或 KeyboardEventArgs
的 Handled
属性来阻止 Windows 消息传递给其他应用程序。请注意,您需要使用 DLL 文件,而不是项目中的类;否则它们可能无法正常工作。
- 剪贴板钩子
- 键盘钩子
- 鼠标钩子
此组件与我所见过的其他类似文章不同,它提供了另外两项功能:
- 阻止消息传递给其他窗口
- 引发
MouseClick
和MouseDoubleClick
事件(我从未在其他低级别钩子中见过这种实现!)
鼠标钩子
WindowsHookLib
库的 MouseHook
类设计用于全局挂钩鼠标并引发一些有用的事件。由于此钩子是低级别的,而低级别鼠标钩子无法获取 MouseClick
和 MouseDoubleClick
消息,因此它会模拟这些事件。为了使用这些事件,类对象变量应使用 WithEvents
关键字声明。
MouseDown
、MouseUp
、MouseWheel
和 MouseMove
事件处理程序包含一个 WindowsHookLib.MouseEventArgs
类对象,该对象提供了有关鼠标的所有相关信息,就像 System.Windows.Forms.MouseEventArgs
一样,并且还有两个附加属性:Handled
和 Control
。您可以将 Handled
属性设置为 True
来阻止消息传递给其他窗口。Control
属性提供了鼠标指针下的控件的句柄。如果您决定在 MouseUp
事件中设置 Handled
属性,那么建议在 MouseDown
事件中也进行设置以获得更好的应用程序性能。反之,如果您决定在 MouseDown
事件中设置 Handled
属性,那么建议在 MouseUp
事件中也进行设置。
注意:如果您无条件地在上述事件中设置 Handled
属性,则可能无法使用鼠标。要条件化(阻止鼠标消息传递给其他窗口或控件),您应该将 Control
属性的值与允许的控件句柄进行比较。如果允许的控件句柄列表不包含 Control
属性的值,则可以将 Handled
属性设置为 True
;否则,请勿设置。您可以查看演示项目中的示例,了解如何条件化鼠标处理过程。
注意:在退出应用程序之前,必须调用钩子对象的 Dispose
方法来卸载钩子并释放类变量。
键盘钩子
WindowsHookLib
库的 KeyboardHook
类可用于全局挂钩键盘。该类提供了三个事件,其 KeyDown
和 KeyUp
事件处理程序包含一个 WindowsHookLib.KeyEventArgs
对象,该对象具有与 System.Windows.Forms.KeyEventArgs
一样关于按键的所有相关信息。与鼠标钩子一样,您可以在 KeyDown
和 KeyUp
事件处理程序中将 Handled
属性设置为 True
,以阻止消息传递给其他窗口。
剪贴板钩子
WindowsHookLib
库的 ClipboardHook
类可用于将窗口挂入剪贴板链。该类提供了两个事件:ClipbordChanged
和 StateChanged
。ClipboardChanged
事件处理程序包含一个 WindowsHookLib.ClipboardEventArgs
对象,该对象具有关于事件的所有相关信息。
Using the Code
注意:您需要通过在项目中引用 DLL 文件来使用它,而不是直接使用类;否则它们可能无法正常工作。如果您需要方法说明,则需要将“WindowsHookLib.xml”文件复制到您的项目文件夹中。
Imports WindowsHookLib
'Class level declarations
Dim WithEvents kHook As New KeyboardHook
Dim WithEvents mHook As New MouseHook
Dim WithEvents cHook As New ClipboardHook
'Allowed control handle list
Dim alowedList As New List(Of IntPtr)
Try
'Install the hooks
kHook.InstallHook()
mHook.InstallHook()
cHook.InstallHook(Me) 'takes a window as its parameter.
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Try
'Remove the hooks
kHook.RemoveHook()
mHook.RemoveHook()
cHook.RemoveHook()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Private Sub kHook_KeyDown( _
ByVal sender As Object, _
ByVal e As WindowsHookLib.KeyEventArgs) Handles kHook.KeyDown
'Block Alt+PrintScreen key combination
e.Handled = (e.Modifiers = Keys.Alt AndAlso _
e.KeyCode = Keys.PrintScreen)
End Sub
Private Sub mHook_MouseDown( _
ByVal sender As Object, _
ByVal e As WindowsHookLib.MouseEventArgs) Handles mHook.MouseDown
'Set the Handled property for the mouse down event
'to block the mouse down message for the
'controls that are not in the alowedList.
e.Handled = Not Me.alowedList.Contains(Ctype(sender,IntPtr))
'Do some other things here
'...
'...
End Sub
Private Sub mHook_MouseUp( _
ByVal sender As Object, _
ByVal e As WindowsHookLib.MouseEventArgs) Handles mHook.MouseUp
'Set the Handled property for the mouse up event
'to block the mouse up message for the
'controls that are not in the alowedList.
e.Handled = Not Me.alowedList.Contains(Ctype(sender,IntPtr))
'Do some other things here
'...
'...
End Sub
Private Sub cHook_ClipboardChanged( _
ByVal sender As Object, _
ByVal e As WindowsHookLib.ClipboardEventArgs) _
Handles cHook.ClipboardChanged
'The clipboard content is changed, do something about it.
'...
'...
End Sub
有关更多示例,请查看源代码和演示文件。
背景
此组件的核心在于 API 方法。所有钩子都使用一些 API 方法来挂钩和监视 Windows 消息。以下列表是使用到的 API 方法:
SetWindowsHookEx
UnhookWindowsHookEx
CallNextHookEx
WindowFromPoint
SendInput
SetClipboardViewer
ChangeClipboardChain
关注点
我从这个项目中学习到了很多东西,例如如何在 .NET 环境中创建可以在各种项目(VB.NET、C#、C++、J#)中使用的 DLL 文件组件。还学习了如何为类或方法应用属性,使组件更加专业。
由于低级别鼠标钩子无法获取 MouseClick
和 MouseDoubleClick
事件消息(我相信这些消息是由接收 MouseDown
和 MouseUp
消息的窗口生成的),我尝试模拟这些事件,使其以与 Windows MouseClick
和 MouseDoubleClick
事件相同的模式生成。
WindowsHookLib 信息
- 作者:Arman Ghazanchyan
- 当前程序集版本:1.1.1.2
- 当前文件版本:1.0.0.6
- WindowsHookLib 网页
历史
- 更新了程序集版本 1.1.0.1。此更新解决了所有钩子的问题。
WindowsHookLib
程序集已签名。- 添加了剪贴板钩子 - 新增
- 更新了程序集版本 1.1.0.2。此更新解决了键盘钩子的问题。
KeyEventArgs
类的小改动
- 更新了程序集版本 1.1.0.5。此更新解决了所有钩子的问题。
- 小的更改和修复
- 更新了程序集版本 1.1.1.0。此更新解决了所有钩子的问题。已对更新进行了重大推荐。
- 一些更改和修复
- 更新了程序集版本 1.1.1.2。此更新解决了所有钩子的问题,强烈推荐进行更新。
- 该库已用 C# 语言重写。
- 库中进行了许多修复和优化。
- 剪贴板钩子 bug 修复。之前的版本中钩子未正确实现,这会导致 Windows 剪贴板链中断。此版本解决了该问题。
- 此版本的库比以前的版本体积更小。