Refactor GlobalHotkeyService to support dynamic hotkey registration and update. Introduce HotkeyModifiers and HotkeyVirtualKey properties in SettingsService for user-defined hotkeys.
This commit is contained in:
175
ClipForge/HotkeyHelper.cs
Normal file
175
ClipForge/HotkeyHelper.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Windows.System;
|
||||
|
||||
namespace ClipForge
|
||||
{
|
||||
/// <summary>Converts between hotkey modifier/vk and display strings.</summary>
|
||||
public static class HotkeyHelper
|
||||
{
|
||||
public const uint MOD_ALT = 0x0001;
|
||||
public const uint MOD_CONTROL = 0x0002;
|
||||
public const uint MOD_SHIFT = 0x0004;
|
||||
public const uint MOD_WIN = 0x0008;
|
||||
public const uint MOD_NOREPEAT = 0x4000;
|
||||
|
||||
private static readonly Dictionary<VirtualKey, string> KeyNames = new()
|
||||
{
|
||||
{ VirtualKey.LeftButton, "LMB" },
|
||||
{ VirtualKey.RightButton, "RMB" },
|
||||
{ VirtualKey.Cancel, "Cancel" },
|
||||
{ VirtualKey.Back, "Backspace" },
|
||||
{ VirtualKey.Tab, "Tab" },
|
||||
{ VirtualKey.Clear, "Clear" },
|
||||
{ VirtualKey.Enter, "Enter" },
|
||||
{ VirtualKey.Shift, "Shift" },
|
||||
{ VirtualKey.Control, "Ctrl" },
|
||||
{ VirtualKey.Menu, "Alt" },
|
||||
{ VirtualKey.Pause, "Pause" },
|
||||
{ VirtualKey.CapitalLock, "Caps Lock" },
|
||||
{ VirtualKey.Kana, "Kana" },
|
||||
{ VirtualKey.Hangul, "Hangul" },
|
||||
{ VirtualKey.Junja, "Junja" },
|
||||
{ VirtualKey.Final, "Final" },
|
||||
{ VirtualKey.Hanja, "Hanja" },
|
||||
{ VirtualKey.Kanji, "Kanji" },
|
||||
{ VirtualKey.Escape, "Escape" },
|
||||
{ VirtualKey.Convert, "Convert" },
|
||||
{ VirtualKey.NonConvert, "NonConvert" },
|
||||
{ VirtualKey.Accept, "Accept" },
|
||||
{ VirtualKey.ModeChange, "ModeChange" },
|
||||
{ VirtualKey.Space, "Space" },
|
||||
{ VirtualKey.PageUp, "PgUp" },
|
||||
{ VirtualKey.PageDown, "PgDn" },
|
||||
{ VirtualKey.End, "End" },
|
||||
{ VirtualKey.Home, "Home" },
|
||||
{ VirtualKey.Left, "Left" },
|
||||
{ VirtualKey.Up, "Up" },
|
||||
{ VirtualKey.Right, "Right" },
|
||||
{ VirtualKey.Down, "Down" },
|
||||
{ VirtualKey.Select, "Select" },
|
||||
{ VirtualKey.Print, "Print" },
|
||||
{ VirtualKey.Execute, "Execute" },
|
||||
{ VirtualKey.Snapshot, "Print Screen" },
|
||||
{ VirtualKey.Insert, "Insert" },
|
||||
{ VirtualKey.Delete, "Delete" },
|
||||
{ VirtualKey.Help, "Help" },
|
||||
{ VirtualKey.Number0, "0" },
|
||||
{ VirtualKey.Number1, "1" },
|
||||
{ VirtualKey.Number2, "2" },
|
||||
{ VirtualKey.Number3, "3" },
|
||||
{ VirtualKey.Number4, "4" },
|
||||
{ VirtualKey.Number5, "5" },
|
||||
{ VirtualKey.Number6, "6" },
|
||||
{ VirtualKey.Number7, "7" },
|
||||
{ VirtualKey.Number8, "8" },
|
||||
{ VirtualKey.Number9, "9" },
|
||||
{ VirtualKey.A, "A" },
|
||||
{ VirtualKey.B, "B" },
|
||||
{ VirtualKey.C, "C" },
|
||||
{ VirtualKey.D, "D" },
|
||||
{ VirtualKey.E, "E" },
|
||||
{ VirtualKey.F, "F" },
|
||||
{ VirtualKey.G, "G" },
|
||||
{ VirtualKey.H, "H" },
|
||||
{ VirtualKey.I, "I" },
|
||||
{ VirtualKey.J, "J" },
|
||||
{ VirtualKey.K, "K" },
|
||||
{ VirtualKey.L, "L" },
|
||||
{ VirtualKey.M, "M" },
|
||||
{ VirtualKey.N, "N" },
|
||||
{ VirtualKey.O, "O" },
|
||||
{ VirtualKey.P, "P" },
|
||||
{ VirtualKey.Q, "Q" },
|
||||
{ VirtualKey.R, "R" },
|
||||
{ VirtualKey.S, "S" },
|
||||
{ VirtualKey.T, "T" },
|
||||
{ VirtualKey.U, "U" },
|
||||
{ VirtualKey.V, "V" },
|
||||
{ VirtualKey.W, "W" },
|
||||
{ VirtualKey.X, "X" },
|
||||
{ VirtualKey.Y, "Y" },
|
||||
{ VirtualKey.Z, "Z" },
|
||||
{ VirtualKey.LeftWindows, "Win" },
|
||||
{ VirtualKey.RightWindows, "Win" },
|
||||
{ VirtualKey.Application, "App" },
|
||||
{ VirtualKey.Sleep, "Sleep" },
|
||||
{ VirtualKey.NumberPad0, "Num 0" },
|
||||
{ VirtualKey.NumberPad1, "Num 1" },
|
||||
{ VirtualKey.NumberPad2, "Num 2" },
|
||||
{ VirtualKey.NumberPad3, "Num 3" },
|
||||
{ VirtualKey.NumberPad4, "Num 4" },
|
||||
{ VirtualKey.NumberPad5, "Num 5" },
|
||||
{ VirtualKey.NumberPad6, "Num 6" },
|
||||
{ VirtualKey.NumberPad7, "Num 7" },
|
||||
{ VirtualKey.NumberPad8, "Num 8" },
|
||||
{ VirtualKey.NumberPad9, "Num 9" },
|
||||
{ VirtualKey.Multiply, "Num *" },
|
||||
{ VirtualKey.Add, "Num +" },
|
||||
{ VirtualKey.Separator, "Num ," },
|
||||
{ VirtualKey.Subtract, "Num -" },
|
||||
{ VirtualKey.Decimal, "Num ." },
|
||||
{ VirtualKey.Divide, "Num /" },
|
||||
{ VirtualKey.F1, "F1" },
|
||||
{ VirtualKey.F2, "F2" },
|
||||
{ VirtualKey.F3, "F3" },
|
||||
{ VirtualKey.F4, "F4" },
|
||||
{ VirtualKey.F5, "F5" },
|
||||
{ VirtualKey.F6, "F6" },
|
||||
{ VirtualKey.F7, "F7" },
|
||||
{ VirtualKey.F8, "F8" },
|
||||
{ VirtualKey.F9, "F9" },
|
||||
{ VirtualKey.F10, "F10" },
|
||||
{ VirtualKey.F11, "F11" },
|
||||
{ VirtualKey.F12, "F12" },
|
||||
{ VirtualKey.F13, "F13" },
|
||||
{ VirtualKey.F14, "F14" },
|
||||
{ VirtualKey.F15, "F15" },
|
||||
{ VirtualKey.F16, "F16" },
|
||||
{ VirtualKey.F17, "F17" },
|
||||
{ VirtualKey.F18, "F18" },
|
||||
{ VirtualKey.F19, "F19" },
|
||||
{ VirtualKey.F20, "F20" },
|
||||
{ VirtualKey.F21, "F21" },
|
||||
{ VirtualKey.F22, "F22" },
|
||||
{ VirtualKey.F23, "F23" },
|
||||
{ VirtualKey.F24, "F24" },
|
||||
{ VirtualKey.NumberKeyLock, "NumLock" },
|
||||
{ VirtualKey.Scroll, "Scroll Lock" },
|
||||
{ VirtualKey.LeftShift, "Shift" },
|
||||
{ VirtualKey.RightShift, "Shift" },
|
||||
{ VirtualKey.LeftControl, "Ctrl" },
|
||||
{ VirtualKey.RightControl, "Ctrl" },
|
||||
{ VirtualKey.LeftMenu, "Alt" },
|
||||
{ VirtualKey.RightMenu, "Alt" },
|
||||
};
|
||||
|
||||
/// <summary>Format modifier flags + virtual key as display string (e.g. "Alt + PgUp").</summary>
|
||||
public static string ToDisplayString(uint modifiers, uint vk)
|
||||
{
|
||||
var parts = new List<string>();
|
||||
if ((modifiers & MOD_WIN) != 0) parts.Add("Win");
|
||||
if ((modifiers & MOD_CONTROL) != 0) parts.Add("Ctrl");
|
||||
if ((modifiers & MOD_ALT) != 0) parts.Add("Alt");
|
||||
if ((modifiers & MOD_SHIFT) != 0) parts.Add("Shift");
|
||||
var keyName = GetKeyName((VirtualKey)vk);
|
||||
if (!string.IsNullOrEmpty(keyName))
|
||||
parts.Add(keyName);
|
||||
return parts.Count > 0 ? string.Join(" + ", parts) : "None";
|
||||
}
|
||||
|
||||
public static string GetKeyName(VirtualKey key)
|
||||
{
|
||||
return KeyNames.TryGetValue(key, out var name) ? name : key.ToString();
|
||||
}
|
||||
|
||||
/// <summary>True if the key is typically used only as a modifier (don't use as sole key).</summary>
|
||||
public static bool IsModifierKey(VirtualKey key)
|
||||
{
|
||||
return key == VirtualKey.LeftWindows || key == VirtualKey.RightWindows
|
||||
|| key == VirtualKey.Control || key == VirtualKey.LeftControl || key == VirtualKey.RightControl
|
||||
|| key == VirtualKey.Menu || key == VirtualKey.LeftMenu || key == VirtualKey.RightMenu
|
||||
|| key == VirtualKey.Shift || key == VirtualKey.LeftShift || key == VirtualKey.RightShift;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user