SharpHook 1.0.0-preview.3

This is a prerelease version of SharpHook.
There is a newer version of this package available.
See the version list below for details.
dotnet add package SharpHook --version 1.0.0-preview.3
NuGet\Install-Package SharpHook -Version 1.0.0-preview.3
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SharpHook" Version="1.0.0-preview.3" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SharpHook --version 1.0.0-preview.3
#r "nuget: SharpHook, 1.0.0-preview.3"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SharpHook as a Cake Addin
#addin nuget:?package=SharpHook&version=1.0.0-preview.3&prerelease

// Install SharpHook as a Cake Tool
#tool nuget:?package=SharpHook&version=1.0.0-preview.3&prerelease

SharpHook

SharpHook is a library which provides a cross-platform global keyboard and mouse hook for .NET. It is a thin wrapper of libuiohook and provides direct access to its features as well as a higher-level interfaces and classes to work with it.

Usage

Native Methods of libuiohook

SharpHook exposes the methods of libuiohook in the SharpHook.Native.UioHook class. The SharpHook.Native namespace also contains structs and enums which represent the data returned by libuiohook.

Note: In general, you shouldn't use native methods directly. Instead, use the higher-level interface and classes provided by SharpHook.

UioHook contains the following methods for working with the global hook:

  • SetDispatchProc - sets the function which will be called when an event is raised by libuiohook.
  • Run - creates a global hook and runs it on the current thread, blocking it until Stop is called.
  • Stop - destroys the global hook.

libuiohook also provides functions to get various system properties. The corresponding methods are also present in UioHook.

Default Global Hooks

SharpHook provides the IGlobalHook interface along with two default implementations which you can use to control the hook and subscribe to its events. Here's a basic usage example:

using SharpHook;

// ...

var hook = new TaskPoolGlobalHook();

hook.HookEnabled += OnHookEnabled;
hook.HookDisabled += OnHookDisabled;

hook.KeyTyped += OnKeyTyped;
hook.KeyPressed += OnKeyPressed;
hook.KeyReleased += OnKeyReleased;

hook.MouseClicked += OnMouseClicked;
hook.MousePressed += OnMousePressed;
hook.MouseReleased += OnMouseReleased;
hook.MouseMoved += OnMouseMoved;
hook.MouseDragged += OnMouseDragged;

hook.MouseWheel += OnMouseWheel;

await hook.Start();

First, you create the hook, then subscribe to its events, and then start it. The Start() method returns a Task which is finished when the hook is destroyed, so if you await it, you block the current async context until it stops. You can subscribe to events after the hook is started.

IGlobalHook extends IDisposable. When you call the Dispose method on a hook, it's destroyed. The contract of the interface is that once a hook has been destroyed, it cannot be started again - you'll have to create a new instance.

Important: Always use one instance of IGlobalHook at a time in the entire application since they all must use the same static method to set the hook callback for libuiohook, and there may only be one callback at a time.

SharpHook provides two implementations of IGlobalHook:

  • SimpleGlobalHook runs the hook on a separate thread, and runs all of its event handlers on that same thread. This means that the handlers should generally be fast since they will block the hook from handling the events that follow if they run for too long.

  • TaskPoolGlobalHook runs the hook on a separate thread, and runs all of its event handlers on other threads inside the default thread pool for tasks. The parallelism level of the handlers can be configured. On backpressure it will queue the remaining handlers. This means that the hook will be able to process all events. This implementation should be preferred to SimpleGlobalHook except for very simple use-cases.

The library also provides the GlobalHookBase class which you can extend to create your own implementation of the global hook. It runs the hook on a separate thread and calls appropriate event handlers. You only need to implement a strategy for dispatching the events.

Reactive Global Hooks

Use the SharpHook.Reactive package for reactive global hooks.

Icon

Icon made by Freepik from www.flaticon.com.

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 is compatible. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 is compatible.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETCoreApp 3.1

    • No dependencies.
  • .NETFramework 4.6.1

    • No dependencies.
  • .NETStandard 2.0

    • No dependencies.
  • net5.0

    • No dependencies.
  • net6.0

    • No dependencies.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on SharpHook:

Package Downloads
SharpHook.Reactive

SharpHook provides a cross-platform global keyboard and mouse hook, event simulation, and text entry simulation for .NET.

VL.IO.MouseKeyGlobal

Global mouse and keyboard hook for vvvv gamma based on Sharphook by Tolik Pylypchuk

Frank.GameEngine.Input

Package Description

Frank.GameEngine.Rendering.MonoGame

Package Description

GitHub repositories (4)

Showing the top 4 popular GitHub repositories that depend on SharpHook:

Repository Stars
Jeric-X/SyncClipboard
跨平台剪贴板同步方案 / Cross-Platform Cipboard Syncing Solution
awaescher/StageManager
🖥️ Stage Manager for Microsoft Windows
PizzaLovers007/AdofaiTweaks
Helpful tweaks for A Dance of Fire and Ice
Particle1904/DatasetHelpers
Dataset Helper program to automatically select, re scale and tag Datasets (composed of image and text) for Machine Learning training.
Version Downloads Last updated
5.3.1 1,806 3/3/2024
5.3.0 727 2/24/2024
5.2.3 2,722 2/1/2024
5.2.2 944 1/13/2024
5.2.1 1,095 1/3/2024
5.2.0 1,027 12/16/2023
5.1.2 1,562 11/25/2023
5.1.1 3,244 10/13/2023
5.1.0 432 10/8/2023
5.0.0 4,417 8/10/2023
4.2.1 2,762 6/18/2023
4.2.0 4,131 4/8/2023
4.1.0 521 3/26/2023
4.0.1 531 3/12/2023
4.0.0 4,086 11/9/2022
3.1.3 1,103 10/27/2022
3.1.2 1,328 10/19/2022
3.1.1 2,868 8/5/2022
3.1.0 1,082 7/30/2022
3.0.2 6,095 7/1/2022
3.0.1 681 6/25/2022
3.0.0 1,065 3/27/2022
2.0.0 1,092 2/4/2022
1.1.0 977 12/4/2021
1.0.1 744 11/21/2021
1.0.0 544 11/8/2021
1.0.0-preview.4 146 11/6/2021
1.0.0-preview.3 161 11/1/2021
1.0.0-preview.2 144 10/26/2021
1.0.0-preview.1 137 10/26/2021