TinyHotKey 1.0.3
See the version list below for details.
dotnet add package TinyHotKey --version 1.0.3
NuGet\Install-Package TinyHotKey -Version 1.0.3
<PackageReference Include="TinyHotKey" Version="1.0.3" />
paket add TinyHotKey --version 1.0.3
#r "nuget: TinyHotKey, 1.0.3"
// Install TinyHotKey as a Cake Addin #addin nuget:?package=TinyHotKey&version=1.0.3 // Install TinyHotKey as a Cake Tool #tool nuget:?package=TinyHotKey&version=1.0.3
TinyHotKey
Windows HotKey handler that does not listen to all keyboard input and has no dependency on Windows Forms or WPF.
This is using RegisterHotKey
on the Win32 API directly, no global hooks, it only listens
to what you tell it to listen to.
Simple example
using var tinyHotKey = new TinyHotKeyInstance();
using var binding = tinyHotKey.RegisterHotKey(Modifier.Control | Modifier.Alt, Key.D, () =>
{
Console.WriteLine("Ctrl+Alt+D detected");
return Task.CompletedTask;
});
Example using dependency injection
// Add it to your DI container using this overload to get logging support as well
services.AddTinyHotKey();
// Later in some service with a dependency on ITinyHotKey tinyHotKey
tinyHotKey.RegisterHotKey(Modifier.Control | Modifier.Alt, Key.D, () =>
{
Console.WriteLine("Ctrl+Alt+D detected");
return Task.CompletedTask;
});
Why? There are hundreds of other similar projects
Actually, no.
I needed trimmable and AOT-compatible hotkey detection and I wasn't able to find any other projects that do this with no dependency on Windows Forms or WPF which is important because those UI frameworks are not even remotely compatible with either trimming or AOT compilation.
There are other projects that use global keyboard hooks instead but they listen to every single key press, just like a keylogger, which is something that I don't like.
How it works
Windows hotkey detection work by detecting keyboard combinations for you and posts messages to your Window. That sounds simple enough but that means first you must have a Window and everything must be done on the UI thread.
So what if you don't have a Window? This works in console apps too, right?
There is no way around having a Window so what TinyHotKey does is create a hidden Window on a dedicated thread using more Win32 calls that handles all hotkey interaction and calls callbacks on a new task off the "UI" thread. There are other projects that do exactly this but none that I was able to find that does all this without parts of Windows Forms or WPF.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. 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 is compatible. 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 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. 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. |
-
.NETStandard 2.0
-
net6.0
-
net7.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.