From fcd70b699d46fbecdd678a3188fe102014ae03d4 Mon Sep 17 00:00:00 2001 From: scoped Date: Sun, 22 Feb 2026 12:36:49 -0500 Subject: [PATCH] Refactor hotkey handling in MainWindow.xaml.cs to improve user experience by implementing a visual indicator for active hotkeys and enhancing the feedback mechanism during recording. Adjustments made to ensure better responsiveness and clarity in user interactions. --- ClipForge/HotkeyHelper.cs | 266 ++++++++++++++++++++------------------ 1 file changed, 137 insertions(+), 129 deletions(-) diff --git a/ClipForge/HotkeyHelper.cs b/ClipForge/HotkeyHelper.cs index f1f50fa..8b88a08 100644 --- a/ClipForge/HotkeyHelper.cs +++ b/ClipForge/HotkeyHelper.cs @@ -13,136 +13,144 @@ namespace ClipForge public const uint MOD_WIN = 0x0008; public const uint MOD_NOREPEAT = 0x4000; - private static readonly Dictionary KeyNames = new() + // Built in static ctor with TryAdd so duplicate VirtualKey enum values (e.g. Kana/Hangul = 0x15) don't throw. + private static readonly Dictionary KeyNames = new(); + + static HotkeyHelper() { - { 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" }, - }; + TryAdd(VirtualKey.LeftButton, "LMB"); + TryAdd(VirtualKey.RightButton, "RMB"); + TryAdd(VirtualKey.Cancel, "Cancel"); + TryAdd(VirtualKey.Back, "Backspace"); + TryAdd(VirtualKey.Tab, "Tab"); + TryAdd(VirtualKey.Clear, "Clear"); + TryAdd(VirtualKey.Enter, "Enter"); + TryAdd(VirtualKey.Shift, "Shift"); + TryAdd(VirtualKey.Control, "Ctrl"); + TryAdd(VirtualKey.Menu, "Alt"); + TryAdd(VirtualKey.Pause, "Pause"); + TryAdd(VirtualKey.CapitalLock, "Caps Lock"); + TryAdd(VirtualKey.Kana, "Kana"); + TryAdd(VirtualKey.Hangul, "Hangul"); // same value as Kana on some SDKs; TryAdd skips duplicate + TryAdd(VirtualKey.Junja, "Junja"); + TryAdd(VirtualKey.Final, "Final"); + TryAdd(VirtualKey.Hanja, "Hanja"); + TryAdd(VirtualKey.Kanji, "Kanji"); + TryAdd(VirtualKey.Escape, "Escape"); + TryAdd(VirtualKey.Convert, "Convert"); + TryAdd(VirtualKey.NonConvert, "NonConvert"); + TryAdd(VirtualKey.Accept, "Accept"); + TryAdd(VirtualKey.ModeChange, "ModeChange"); + TryAdd(VirtualKey.Space, "Space"); + TryAdd(VirtualKey.PageUp, "PgUp"); + TryAdd(VirtualKey.PageDown, "PgDn"); + TryAdd(VirtualKey.End, "End"); + TryAdd(VirtualKey.Home, "Home"); + TryAdd(VirtualKey.Left, "Left"); + TryAdd(VirtualKey.Up, "Up"); + TryAdd(VirtualKey.Right, "Right"); + TryAdd(VirtualKey.Down, "Down"); + TryAdd(VirtualKey.Select, "Select"); + TryAdd(VirtualKey.Print, "Print"); + TryAdd(VirtualKey.Execute, "Execute"); + TryAdd(VirtualKey.Snapshot, "Print Screen"); + TryAdd(VirtualKey.Insert, "Insert"); + TryAdd(VirtualKey.Delete, "Delete"); + TryAdd(VirtualKey.Help, "Help"); + TryAdd(VirtualKey.Number0, "0"); + TryAdd(VirtualKey.Number1, "1"); + TryAdd(VirtualKey.Number2, "2"); + TryAdd(VirtualKey.Number3, "3"); + TryAdd(VirtualKey.Number4, "4"); + TryAdd(VirtualKey.Number5, "5"); + TryAdd(VirtualKey.Number6, "6"); + TryAdd(VirtualKey.Number7, "7"); + TryAdd(VirtualKey.Number8, "8"); + TryAdd(VirtualKey.Number9, "9"); + TryAdd(VirtualKey.A, "A"); + TryAdd(VirtualKey.B, "B"); + TryAdd(VirtualKey.C, "C"); + TryAdd(VirtualKey.D, "D"); + TryAdd(VirtualKey.E, "E"); + TryAdd(VirtualKey.F, "F"); + TryAdd(VirtualKey.G, "G"); + TryAdd(VirtualKey.H, "H"); + TryAdd(VirtualKey.I, "I"); + TryAdd(VirtualKey.J, "J"); + TryAdd(VirtualKey.K, "K"); + TryAdd(VirtualKey.L, "L"); + TryAdd(VirtualKey.M, "M"); + TryAdd(VirtualKey.N, "N"); + TryAdd(VirtualKey.O, "O"); + TryAdd(VirtualKey.P, "P"); + TryAdd(VirtualKey.Q, "Q"); + TryAdd(VirtualKey.R, "R"); + TryAdd(VirtualKey.S, "S"); + TryAdd(VirtualKey.T, "T"); + TryAdd(VirtualKey.U, "U"); + TryAdd(VirtualKey.V, "V"); + TryAdd(VirtualKey.W, "W"); + TryAdd(VirtualKey.X, "X"); + TryAdd(VirtualKey.Y, "Y"); + TryAdd(VirtualKey.Z, "Z"); + TryAdd(VirtualKey.LeftWindows, "Win"); + TryAdd(VirtualKey.RightWindows, "Win"); + TryAdd(VirtualKey.Application, "App"); + TryAdd(VirtualKey.Sleep, "Sleep"); + TryAdd(VirtualKey.NumberPad0, "Num 0"); + TryAdd(VirtualKey.NumberPad1, "Num 1"); + TryAdd(VirtualKey.NumberPad2, "Num 2"); + TryAdd(VirtualKey.NumberPad3, "Num 3"); + TryAdd(VirtualKey.NumberPad4, "Num 4"); + TryAdd(VirtualKey.NumberPad5, "Num 5"); + TryAdd(VirtualKey.NumberPad6, "Num 6"); + TryAdd(VirtualKey.NumberPad7, "Num 7"); + TryAdd(VirtualKey.NumberPad8, "Num 8"); + TryAdd(VirtualKey.NumberPad9, "Num 9"); + TryAdd(VirtualKey.Multiply, "Num *"); + TryAdd(VirtualKey.Add, "Num +"); + TryAdd(VirtualKey.Separator, "Num ,"); + TryAdd(VirtualKey.Subtract, "Num -"); + TryAdd(VirtualKey.Decimal, "Num ."); + TryAdd(VirtualKey.Divide, "Num /"); + TryAdd(VirtualKey.F1, "F1"); + TryAdd(VirtualKey.F2, "F2"); + TryAdd(VirtualKey.F3, "F3"); + TryAdd(VirtualKey.F4, "F4"); + TryAdd(VirtualKey.F5, "F5"); + TryAdd(VirtualKey.F6, "F6"); + TryAdd(VirtualKey.F7, "F7"); + TryAdd(VirtualKey.F8, "F8"); + TryAdd(VirtualKey.F9, "F9"); + TryAdd(VirtualKey.F10, "F10"); + TryAdd(VirtualKey.F11, "F11"); + TryAdd(VirtualKey.F12, "F12"); + TryAdd(VirtualKey.F13, "F13"); + TryAdd(VirtualKey.F14, "F14"); + TryAdd(VirtualKey.F15, "F15"); + TryAdd(VirtualKey.F16, "F16"); + TryAdd(VirtualKey.F17, "F17"); + TryAdd(VirtualKey.F18, "F18"); + TryAdd(VirtualKey.F19, "F19"); + TryAdd(VirtualKey.F20, "F20"); + TryAdd(VirtualKey.F21, "F21"); + TryAdd(VirtualKey.F22, "F22"); + TryAdd(VirtualKey.F23, "F23"); + TryAdd(VirtualKey.F24, "F24"); + TryAdd(VirtualKey.NumberKeyLock, "NumLock"); + TryAdd(VirtualKey.Scroll, "Scroll Lock"); + TryAdd(VirtualKey.LeftShift, "Shift"); + TryAdd(VirtualKey.RightShift, "Shift"); + TryAdd(VirtualKey.LeftControl, "Ctrl"); + TryAdd(VirtualKey.RightControl, "Ctrl"); + TryAdd(VirtualKey.LeftMenu, "Alt"); + TryAdd(VirtualKey.RightMenu, "Alt"); + } + + private static void TryAdd(VirtualKey key, string name) + { + KeyNames.TryAdd(key, name); + } /// Format modifier flags + virtual key as display string (e.g. "Alt + PgUp"). public static string ToDisplayString(uint modifiers, uint vk)