| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | using System;using System.Collections.Generic;using System.Linq;using System.Windows;using System.Windows.Input;using KeyEventHandler = System.Windows.Input.KeyEventHandler;namespace InABox.WPF{    public enum HotKeyModifier    {        Ctrl,        Shift,        Alt    }    public static class HotKeyManager    {        private static readonly List<Tuple<Key, HotKeyModifier[], Func<bool>>> _hotkeys = new();        private static Tuple<Key, HotKeyModifier[], Func<bool>> FindHotKey(Key key, HotKeyModifier[] modifiers)        {            var m = modifiers != null ? modifiers : new HotKeyModifier[] { };            var existing = _hotkeys.FirstOrDefault(                x => x.Item1 == key && x.Item2.Length == m.Length && x.Item2.Intersect(m).Count() == x.Item2.Length);            return existing;        }        public static void RegisterHotKey(Key key, Func<bool> action)        {            RegisterHotKey(key, new HotKeyModifier[] { }, action);        }        public static void RegisterHotKey(Key key, HotKeyModifier[] modifiers, Func<bool> action)        {            var existing = FindHotKey(key, modifiers);            if (existing != null)                throw new Exception(string.Format("HotKey [{0}+{1}] is already registered!", string.Join("+", modifiers.Select(x => x)), key));            _hotkeys.Add(new Tuple<Key, HotKeyModifier[], Func<bool>>(key, modifiers, action));        }        public static void UnRegisterHotKey(Key key)        {            UnRegisterHotKey(key, new HotKeyModifier[] { });        }        public static void UnRegisterHotKey(Key key, HotKeyModifier[] modifiers)        {            var existing = FindHotKey(key, modifiers);            if (existing != null)                _hotkeys.Remove(existing);        }        public static bool ProcessHotKey(Key key)        {            var modifiers = new List<HotKeyModifier>();            if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))                modifiers.Add(HotKeyModifier.Shift);            if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))                modifiers.Add(HotKeyModifier.Ctrl);            if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))                modifiers.Add(HotKeyModifier.Alt);            var existing = FindHotKey(key, modifiers.ToArray());            if (existing != null)                return existing.Item3.Invoke();            return false;        }        public static void Initialize()        {            EventManager.RegisterClassHandler(                typeof(Window),                Keyboard.KeyDownEvent,                new KeyEventHandler(                    (o, args) =>                    {                        ProcessHotKey(args.Key);                        //args.Handled = args.Key == Key.Space ? true : ProcessHotKey(args.Key);                    }                ),                true            );        }    }}
 |