Introduction
The WindowsHookLib
is a single library to hook the mouse, keyboard and the clipboard system wide. WindowsHookLib
library has been rewritten in C# and therefore it uses Common Language Runtime (CLR). This means that the library can be referenced from various projects in .NET. The mouse and keyboard hooks are low level so you can use the Handled
property of the MouseEventArgs
or the KeyboardEventArgs
to prevent the windows messages being passed to the other applications. Note you need to use the DLL file, not the classes in your projects; otherwise they might not work correctly.
- Clipboard hook
- Keyboard hook
- Mouse hook
This component differs from what I have seen in other similar articles, by providing two more things:
- Preventing a message to be passed to other windows
- Raising the
MouseClick
and MouseDoubleClick
events (I have never seen implementation of this in other low level hooks!)
Mouse Hook
The MouseHook
class of the 'WindowsHookLib
' library is designed to hook the mouse globally and raise some useful events. Since this hook is low level and low level mouse hooks don't get the MouseClick
and MouseDoubleClick
messages, it simulates these events. In order to use these events, the class object variable should be declared with the WithEvents
keyword.
The MouseDown
, MouseUp
, MouseWheel
, and MouseMove
event handlers have a WindowsHookLib.MouseEventArgs
class object which provides all the relevant information about the mouse as does the System.Windows.Forms.MouseEventArgs
, and two additional properties, Handled
and Control
. You can set the Handled
property to True
to prevent the message from being passed to the other windows. The Control
property provides the handle of the control under the mouse pointer. If you decide to set the Handled
property in the MouseUp
event, then it is recommended to set it in the MouseDown
event as well for application performance. Conversely, if you decide to set the Handled
property in the MouseDown
event, then it is recommended to set it in the MouseUp
event.
Note: If you set the Handled
property in the mentioned events unconditionally, then you might not be able to use the mouse. To condition (block the mouse message to be passed to other windows or controls), you should compare the Control
property's value against allowed control handle(s). If the allowed controls' handle list doesn't contain the Control
property value, then you can set the Handled
property to True
; otherwise, don't set it. You can check the demo project's examples to see how you can condition the mouse handled process.
Note: Before you exit your application, you must call the hook object's Dispose
method to uninstall the hook and free the class variables.
Keyboard Hook
The KeyboardHook
class of the 'WindowsHookLib
' library can be used to hook the keyboard globally. The class provides three events whose KeyDown
and KeyUp
event handlers contain a WindowsHookLib.KeyEventArgs
object that has all the relevant information about the key as the System.Windows.Forms.KeyEventArgs
. As with the mouse hook, you can set the Handled
property to True
in the KeyDown
and KeyUp
event handlers to prevent the message from being passed to other windows.
Clipboard Hook
The ClipboardHook
class of the 'WindowsHookLib
' library can be used to hook a window to the clipboard chain. The class provides two events, ClipbordChanged
and StateChanged
. The ClipboardChanged
event handler contains a WindowsHookLib.ClipboardEventArgs
object that has all the relevant information about the event.
Using the Code
Note: You need to use the DLL file by referencing it in your project, not the classes; otherwise, they might not work correctly. If you need the method descriptions, then you need to copy the 'WindowsHookLib.xml' file into your project folder.
Imports WindowsHookLib
Dim WithEvents kHook As New KeyboardHook
Dim WithEvents mHook As New MouseHook
Dim WithEvents cHook As New ClipboardHook
Dim alowedList As New List(Of IntPtr)
Try
kHook.InstallHook()
mHook.InstallHook()
cHook.InstallHook(Me) Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Try
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
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
e.Handled = Not Me.alowedList.Contains(Ctype(sender,IntPtr))
End Sub
Private Sub mHook_MouseUp( _
ByVal sender As Object, _
ByVal e As WindowsHookLib.MouseEventArgs) Handles mHook.MouseUp
e.Handled = Not Me.alowedList.Contains(Ctype(sender,IntPtr))
End Sub
Private Sub cHook_ClipboardChanged( _
ByVal sender As Object, _
ByVal e As WindowsHookLib.ClipboardEventArgs) _
Handles cHook.ClipboardChanged
End Sub
For more examples, check out the source code and demo files.
Background
In the core of this component lies the API methods. All hooks use some API methods to hook and monitor for Windows messages. The following list is the API methods that have been used:
SetWindowsHookEx
UnhookWindowsHookEx
CallNextHookEx
WindowFromPoint
SendInput
SetClipboardViewer
ChangeClipboardChain
Points of Interest
I learned many things from this project like how to make a DLL file component that can be used in various projects (VB.NET, C#, C++, J#) in the .NET environment. Also, how to apply attributes to classes or methods that will make a component professional.
Since low level mouse hooks don't get the MouseClick
and MouseDoubleClick
event messages (which I believe are generated by a window that gets the MouseDown
and MouseUp
messages), I tried to simulate these events such that they are generated in the same pattern as the Windows MouseClick
and MouseDoubleClick
events.
WindowsHookLib Information
- Author: Arman Ghazanchyan
- Current assembly version: 1.1.1.2
- Current file version: 1.0.0.6
- WindowsHookLib webpage
History
- Updated assembly version 1.1.0.1. This update addresses all hooks.
- The
WindowsHookLib
assembly is signed.
- A clipboard hook is added - New
- Updated assembly version 1.1.0.2. This update addresses the Keyboard hook.
- Small change in the
KeyEventArgs
class
- Updated assembly version 1.1.0.5. This update addresses to all hooks.
- Updated assembly version 1.1.1.0. This update addresses to all hooks.
- Updated assembly version 1.1.1.2. This update addresses to all hooks, the update is highly recommended.
- The library is rewritten in C# language.
- There are many fixes and optimizations to the library.
- Clipboard Hook bug fix. The hook was not implementing correctly in the previous versions which would lead to breaking up the windows clipboard chain. This version fixes the problem.
- This version of the library is smaller in size than the previous versions.