Easily handle shortcut keys even when your WPF or WinForms app doesn't have focus. Declare hotkeys in XAML with the familiar KeyBinding
syntax.
Nuget packages:
Add a reference to NHotkey.dll
and NHotkey.WindowsForms.dll
. In the file where you want to
handle hotkeys, import the NHotkey.WindowsForms
namespace:
using NHotkey.WindowsForms;
During initialization, add some hotkeys:
HotkeyManager.Current.AddOrReplace("Increment", Keys.Control | Keys.Alt | Keys.Add, OnIncrement);
HotkeyManager.Current.AddOrReplace("Decrement", Keys.Control | Keys.Alt | Keys.Subtract, OnDecrement);
EventHandler<HotkeyEventArgs>
that will be called private void OnIncrement(object sender, HotkeyEventArgs e)
{
Value++;
e.Handled = true;
}
private void OnDecrement(object sender, HotkeyEventArgs e)
{
Value--;
e.Handled = true;
}
If you want to handle several hotkeys with the same handler, you can check the Name
property of the HotkeyEventArgs
:
private void OnIncrementOrDecrement(object sender, HotkeyEventArgs e)
{
switch (e.Name)
{
case "Increment":
Value++;
break;
case "Decrement":
Value--;
break;
}
e.Handled = true;
}
The approach for WPF is very similar to the one for Windows Forms; the exposed API is slightly
different to account for the differences between WinForms and WPF. The WPF version also
supports KeyBindings
.
Add a reference to NHotkey.dll
and NHotkey.Wpf.dll
. In the file where you want to
handle hotkeys, import the NHotkey.Wpf
namespace:
using NHotkey.Wpf;
During initialization, add some hotkeys:
HotkeyManager.Current.AddOrReplace("Increment", Key.Add, ModifierKeys.Control | ModifierKeys.Alt, OnIncrement);
HotkeyManager.Current.AddOrReplace("Decrement", Key.Subtract, ModifierKeys.Control | ModifierKeys.Alt, OnDecrement);
EventHandler<HotkeyEventArgs>
that will be calledTo support applications that use the MVVM pattern, you can also specify hotkeys in XAML using
InputBindings
. Just declare KeyBindings
as usual, and set the HotkeyManager.RegisterGlobalHotkey
attached property to true
:
...
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+Alt+Add" Command="{Binding IncrementCommand}"
HotkeyManager.RegisterGlobalHotkey="True" />
<KeyBinding Gesture="Ctrl+Alt+Subtract" Command="{Binding DecrementCommand}"
HotkeyManager.RegisterGlobalHotkey="True" />
</Window.InputBindings>
...
Known limitations of this feature
HotkeyManager
can't detect if you remove a KeyBinding
; it only relies on theHotkeyManager.RegisterGlobalHotkey
to false, otherwise it willKeyBinding
at runtime is currently not supported. IfKeyBinding
at runtime, you need to set HotkeyManager.RegisterGlobalHotkey
HotkeyManager.RegisterGlobalHotkey
to true again.