diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs index 3dda301b6b..eed8069a93 100644 --- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs +++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs @@ -53,6 +53,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers var physicalKey = AndroidKeyInterop.PhysicalKeyFromScanCode(e.ScanCode); var keySymbol = GetKeySymbol(e.UnicodeChar, physicalKey); + var keyDeviceType = GetKeyDeviceType(e); var rawKeyEvent = new RawKeyEventArgs( AndroidKeyboardDevice.Instance!, @@ -62,6 +63,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers AndroidKeyboardDevice.ConvertKey(e.KeyCode), GetModifierKeys(e), physicalKey, + keyDeviceType, keySymbol); _view.Input?.Invoke(rawKeyEvent); @@ -124,6 +126,20 @@ namespace Avalonia.Android.Platform.Specific.Helpers } } + private KeyDeviceType GetKeyDeviceType(KeyEvent e) + { + var source = e.Device?.Sources ?? InputSourceType.Unknown; + if (source is InputSourceType.Joystick or + InputSourceType.ClassJoystick or + InputSourceType.Gamepad) + return KeyDeviceType.Gamepad; + + if (source == InputSourceType.Dpad && e.Device?.KeyboardType == InputKeyboardType.NonAlphabetic) + return KeyDeviceType.Remote; + + return KeyDeviceType.Keyboard; + } + public void Dispose() { HandleEvents = false; diff --git a/src/Avalonia.Base/Input/Key.cs b/src/Avalonia.Base/Input/Key.cs index 33e1e5df45..71f93e974f 100644 --- a/src/Avalonia.Base/Input/Key.cs +++ b/src/Avalonia.Base/Input/Key.cs @@ -1036,5 +1036,74 @@ namespace Avalonia.Input /// OSX Platform-specific Fn+Down key /// FnDownArrow = 10004, + + /// + /// Remove control home button + /// + MediaHome = 100000, + /// + /// TV Channel up + /// + MediaChannelList = 100001, + /// + /// TV Channel up + /// + MediaChannelRaise = 100002, + /// + /// TV Channel down + /// + MediaChannelLower = 100003, + /// + /// TV Channel down + /// + MediaRecord = 100005, + /// + /// Remote control Red button + /// + MediaRed = 100010, + /// + /// Remote control Green button + /// + MediaGreen = 100011, + /// + /// Remote control Yellow button + /// + MediaYellow = 100012, + /// + /// Remote control Blue button + /// + MediaBlue = 100013, + /// + /// Remote control Menu button + /// + MediaMenu = 100020, + /// + /// Remote control dots button + /// + MediaMore = 100021, + /// + /// Remote control option button + /// + MediaOption = 100022, + /// + /// Remote control channel info button + /// + MediaInfo = 100023, + /// + /// Remote control search button + /// + MediaSearch = 100024, + /// + /// Remote control subtitle/caption button + /// + MediaSubtitle = 100025, + /// + /// Remote control Tv guide detail button + /// + MediaTvGuide = 100026, + /// + /// Remote control Previous Channel + /// + MediaPreviousChannel = 100027, } } diff --git a/src/Avalonia.Base/Input/KeyDeviceType.cs b/src/Avalonia.Base/Input/KeyDeviceType.cs new file mode 100644 index 0000000000..4e16e787f3 --- /dev/null +++ b/src/Avalonia.Base/Input/KeyDeviceType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Input +{ + public enum KeyDeviceType + { + Keyboard, + Gamepad, + Remote + } +} diff --git a/src/Avalonia.Base/Input/KeyEventArgs.cs b/src/Avalonia.Base/Input/KeyEventArgs.cs index 3de078fb37..864aa02617 100644 --- a/src/Avalonia.Base/Input/KeyEventArgs.cs +++ b/src/Avalonia.Base/Input/KeyEventArgs.cs @@ -71,4 +71,9 @@ public class KeyEventArgs : RoutedEventArgs /// /// public string? KeySymbol { get; init; } + + /// + /// Type of the device that fire the event + /// + public KeyDeviceType KeyDeviceType { get; init; } } diff --git a/src/Avalonia.Base/Input/KeyboardDevice.cs b/src/Avalonia.Base/Input/KeyboardDevice.cs index 0cee1bbc96..a6d2ab7a86 100644 --- a/src/Avalonia.Base/Input/KeyboardDevice.cs +++ b/src/Avalonia.Base/Input/KeyboardDevice.cs @@ -196,6 +196,7 @@ namespace Avalonia.Input KeyModifiers = keyInput.Modifiers.ToKeyModifiers(), PhysicalKey = keyInput.PhysicalKey, KeySymbol = keyInput.KeySymbol, + KeyDeviceType = keyInput.KeyDeviceType, Source = element }; diff --git a/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs index 339481ef63..3995e7765c 100644 --- a/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs +++ b/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs @@ -20,7 +20,7 @@ namespace Avalonia.Input.Raw RawKeyEventType type, Key key, RawInputModifiers modifiers) - : this(device, timestamp, root, type, key, modifiers, PhysicalKey.None, null) + : this(device, timestamp, root, type, key, modifiers, PhysicalKey.None, KeyDeviceType.Keyboard, null) { Key = key; Type = type; @@ -36,6 +36,18 @@ namespace Avalonia.Input.Raw RawInputModifiers modifiers, PhysicalKey physicalKey, string? keySymbol) + : this(device, timestamp, root, type, key, modifiers, physicalKey, KeyDeviceType.Keyboard, keySymbol) { } + + public RawKeyEventArgs( + IInputDevice device, + ulong timestamp, + IInputRoot root, + RawKeyEventType type, + Key key, + RawInputModifiers modifiers, + PhysicalKey physicalKey, + KeyDeviceType keyDeviceType, + string? keySymbol) : base(device, timestamp, root) { Key = key; @@ -43,6 +55,7 @@ namespace Avalonia.Input.Raw Type = type; PhysicalKey = physicalKey; KeySymbol = keySymbol; + KeyDeviceType = keyDeviceType; } public Key Key { get; set; } @@ -53,6 +66,8 @@ namespace Avalonia.Input.Raw public PhysicalKey PhysicalKey { get; set; } + public KeyDeviceType KeyDeviceType { get; set; } + public string? KeySymbol { get; set; } } } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 5026896d41..46752446bb 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -291,6 +291,7 @@ namespace Avalonia.Controls KeyModifiers = (KeyModifiers)rawKeyEventArgs.Modifiers, Key = rawKeyEventArgs.Key, PhysicalKey = rawKeyEventArgs.PhysicalKey, + KeyDeviceType= rawKeyEventArgs.KeyDeviceType, KeySymbol = rawKeyEventArgs.KeySymbol }; diff --git a/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs b/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs index f0fbbbf563..52e062f6d8 100644 --- a/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs +++ b/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs @@ -1,4 +1,5 @@ -using Avalonia.Input; +using System.Diagnostics; +using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Logging; using Avalonia.Tizen.Platform.Input; @@ -26,14 +27,10 @@ internal class NuiKeyboardHandler if (ShouldSendKeyEvent(e, out var keyCode)) { - var mapped = TizenKeyboardDevice.ConvertKey(keyCode); - if (mapped == Input.Key.None) - return; - Logger.TryGet(LogEventLevel.Debug, LogKey)?.Log(null, "Triggering key event {text}", e.Key.KeyString); - SendKeyEvent(e, mapped); + SendKeyEvent(e, keyCode); } - else if (e.Key.State == Key.StateType.Up) + else if (e.Key.State == Key.StateType.Up && !string.IsNullOrEmpty(e.Key.KeyString)) { Logger.TryGet(LogEventLevel.Debug, LogKey)?.Log(null, "Triggering text input {text}", e.Key.KeyString); _view.TopLevelImpl.TextInput(e.Key.KeyString); @@ -44,6 +41,7 @@ internal class NuiKeyboardHandler { var type = GetKeyEventType(e); var modifiers = GetModifierKey(e); + var deviceType = GetDeviceType(e); _view.TopLevelImpl.Input?.Invoke( new RawKeyEventArgs( @@ -52,22 +50,25 @@ internal class NuiKeyboardHandler _view.InputRoot, type, mapped, - modifiers)); + modifiers, + PhysicalKey.None, + deviceType, + e.Key.KeyString + )); } - private bool ShouldSendKeyEvent(Window.KeyEventArgs e, out global::Tizen.Uix.InputMethod.KeyCode keyCode) + private bool ShouldSendKeyEvent(Window.KeyEventArgs e, out Input.Key keyCode) { - if (string.IsNullOrEmpty(e.Key.KeyString) || - e.Key.KeyPressedName is "Delete" or "BackSpace" || - e.Key.IsCtrlModifier() || - e.Key.IsAltModifier()) + keyCode = TizenKeyboardDevice.GetSpecialKey(e.Key.KeyPressedName); + if (keyCode != Input.Key.None) + return true; + + if ((e.Key.IsCtrlModifier() || e.Key.IsAltModifier()) && !string.IsNullOrEmpty(e.Key.KeyString)) { - if (Enum.TryParse(e.Key.KeyPressedName, true, out keyCode) || - Enum.TryParse($"Keypad{e.Key.KeyPressedName}", true, out keyCode)) - return true; + var c = e.Key.KeyPressedName.Length == 1 ? e.Key.KeyPressedName[0] : (char)e.Key.KeyCode; + return (keyCode = TizenKeyboardDevice.GetAsciiKey(c)) != Input.Key.None; } - keyCode = 0; return false; } @@ -99,4 +100,15 @@ internal class NuiKeyboardHandler return modifiers; } + + private KeyDeviceType GetDeviceType(Window.KeyEventArgs ev) + { + if (ev.Key.DeviceClass == DeviceClassType.Gamepad) + return KeyDeviceType.Gamepad; + + if (ev.Key.DeviceSubClass == DeviceSubClassType.Remocon) + return KeyDeviceType.Remote; + + return KeyDeviceType.Keyboard; + } } diff --git a/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs b/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs index 6d595014a1..1046134c43 100644 --- a/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs +++ b/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs @@ -4,218 +4,136 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Avalonia.Input; +using Tizen.NUI.Components; using Tizen.Uix.InputMethod; +using static System.Net.Mime.MediaTypeNames; namespace Avalonia.Tizen.Platform.Input; -internal class TizenKeyboardDevice: KeyboardDevice, IKeyboardDevice +internal class TizenKeyboardDevice : KeyboardDevice, IKeyboardDevice { - private static readonly Dictionary KeyDic = new Dictionary - { - // { KeyCode.Cancel?, Key.Cancel }, - { KeyCode.BackSpace, Key.Back }, - { KeyCode.Tab, Key.Tab }, - // { KeyCode.Linefeed?, Key.LineFeed }, - { KeyCode.Clear, Key.Clear }, - { KeyCode.Return, Key.Return }, - { KeyCode.Pause, Key.Pause }, - { KeyCode.CapsLock, Key.CapsLock }, - //{ KeyCode.?, Key.HangulMode } - //{ KeyCode.?, Key.JunjaMode } - //{ KeyCode.?, Key.FinalMode } - //{ KeyCode.?, Key.KanjiMode } - { KeyCode.Escape, Key.Escape }, - //{ KeyCode.?, Key.ImeConvert } - //{ KeyCode.?, Key.ImeNonConvert } - //{ KeyCode.?, Key.ImeAccept } - //{ KeyCode.?, Key.ImeModeChange } - { KeyCode.Space, Key.Space }, - { KeyCode.Page_Up, Key.Prior }, - { KeyCode.Page_Down, Key.PageDown }, - { KeyCode.End, Key.End }, - { KeyCode.Home, Key.Home }, - { KeyCode.Left, Key.Left }, - { KeyCode.Up, Key.Up }, - { KeyCode.Right, Key.Right }, - { KeyCode.Down, Key.Down }, - // { KeyCode.ButtonSelect?, Key.Select }, - // { KeyCode.print?, Key.Print }, - //{ KeyCode.execute?, Key.Execute }, - //{ KeyCode.snap?, Key.Snapshot } - { KeyCode.Insert, Key.Insert }, - { KeyCode.Delete, Key.Delete }, - { KeyCode.Help, Key.Help }, - { KeyCode.Keypad0, Key.D0 }, - { KeyCode.Keypad1, Key.D1 }, - { KeyCode.Keypad2, Key.D2 }, - { KeyCode.Keypad3, Key.D3 }, - { KeyCode.Keypad4, Key.D4 }, - { KeyCode.Keypad5, Key.D5 }, - { KeyCode.Keypad6, Key.D6 }, - { KeyCode.Keypad7, Key.D7 }, - { KeyCode.Keypad8, Key.D8 }, - { KeyCode.Keypad9, Key.D9 }, - { KeyCode.KeypadA, Key.A }, - { KeyCode.KeypadB, Key.B }, - { KeyCode.KeypadC, Key.C }, - { KeyCode.KeypadD, Key.D }, - { KeyCode.KeypadE, Key.E }, - { KeyCode.KeypadF, Key.F }, - { KeyCode.KeypadG, Key.G }, - { KeyCode.KeypadH, Key.H }, - { KeyCode.KeypadI, Key.I }, - { KeyCode.KeypadJ, Key.J }, - { KeyCode.KeypadK, Key.K }, - { KeyCode.KeypadL, Key.L }, - { KeyCode.KeypadM, Key.M }, - { KeyCode.KeypadN, Key.N }, - { KeyCode.KeypadO, Key.O }, - { KeyCode.KeypadP, Key.P }, - { KeyCode.KeypadQ, Key.Q }, - { KeyCode.KeypadR, Key.R }, - { KeyCode.KeypadS, Key.S }, - { KeyCode.KeypadT, Key.T }, - { KeyCode.KeypadU, Key.U }, - { KeyCode.KeypadV, Key.V }, - { KeyCode.KeypadW, Key.W }, - { KeyCode.KeypadX, Key.X }, - { KeyCode.KeypadY, Key.Y }, - { KeyCode.KeypadZ, Key.Z }, - { KeyCode.Keypada, Key.A }, - { KeyCode.Keypadb, Key.B }, - { KeyCode.Keypadc, Key.C }, - { KeyCode.Keypadd, Key.D }, - { KeyCode.Keypade, Key.E }, - { KeyCode.Keypadf, Key.F }, - { KeyCode.Keypadg, Key.G }, - { KeyCode.Keypadh, Key.H }, - { KeyCode.Keypadi, Key.I }, - { KeyCode.Keypadj, Key.J }, - { KeyCode.Keypadk, Key.K }, - { KeyCode.Keypadl, Key.L }, - { KeyCode.Keypadm, Key.M }, - { KeyCode.Keypadn, Key.N }, - { KeyCode.Keypado, Key.O }, - { KeyCode.Keypadp, Key.P }, - { KeyCode.Keypadq, Key.Q }, - { KeyCode.Keypadr, Key.R }, - { KeyCode.Keypads, Key.S }, - { KeyCode.Keypadt, Key.T }, - { KeyCode.Keypadu, Key.U }, - { KeyCode.Keypadv, Key.V }, - { KeyCode.Keypadw, Key.W }, - { KeyCode.Keypadx, Key.X }, - { KeyCode.Keypady, Key.Y }, - { KeyCode.Keypadz, Key.Z }, - //{ KeyCode.?, Key.LWin } - //{ KeyCode.?, Key.RWin } - //{ KeyCode.?, Key.Apps } - //{ KeyCode.Sle, Key.Sleep }, - { KeyCode.KP0, Key.NumPad0 }, - { KeyCode.KP1, Key.NumPad1 }, - { KeyCode.KP2, Key.NumPad2 }, - { KeyCode.KP3, Key.NumPad3 }, - { KeyCode.KP4, Key.NumPad4 }, - { KeyCode.KP5, Key.NumPad5 }, - { KeyCode.KP6, Key.NumPad6 }, - { KeyCode.KP7, Key.NumPad7 }, - { KeyCode.KP8, Key.NumPad8 }, - { KeyCode.KP9, Key.NumPad9 }, - { KeyCode.KPMultiply, Key.Multiply }, - { KeyCode.KPAdd, Key.Add }, - { KeyCode.KPSeparator, Key.Separator }, - { KeyCode.KPSubtract, Key.Subtract }, - { KeyCode.KPDecimal, Key.Decimal }, - { KeyCode.KPDivide, Key.Divide }, - { KeyCode.F1, Key.F1 }, - { KeyCode.F2, Key.F2 }, - { KeyCode.F3, Key.F3 }, - { KeyCode.F4, Key.F4 }, - { KeyCode.F5, Key.F5 }, - { KeyCode.F6, Key.F6 }, - { KeyCode.F7, Key.F7 }, - { KeyCode.F8, Key.F8 }, - { KeyCode.F9, Key.F9 }, - { KeyCode.F10, Key.F10 }, - { KeyCode.F11, Key.F11 }, - { KeyCode.F12, Key.F12 }, - //{ KeyCode.f13, Key.F13 }, - //{ KeyCode.F14, Key.F14 }, - //{ KeyCode.L5, Key.F15 }, - //{ KeyCode.F16, Key.F16 }, - //{ KeyCode.F17, Key.F17 }, - //{ KeyCode.L8, Key.F18 }, - //{ KeyCode.L9, Key.F19 }, - //{ KeyCode.L10, Key.F20 }, - //{ KeyCode.R1, Key.F21 }, - //{ KeyCode.R2, Key.F22 }, - //{ KeyCode.F23, Key.F23 }, - //{ KeyCode.R4, Key.F24 }, - { KeyCode.Num_Lock, Key.NumLock }, - { KeyCode.ScrollLock, Key.Scroll }, - { KeyCode.ShiftL, Key.LeftShift }, - { KeyCode.ShiftR, Key.RightShift }, - { KeyCode.ControlL, Key.LeftCtrl }, - { KeyCode.ControlR, Key.RightCtrl }, - { KeyCode.AltL, Key.LeftAlt }, - { KeyCode.AltR, Key.RightAlt }, - //{ KeyCode.?, Key.BrowserBack } - //{ KeyCode.?, Key.BrowserForward } - //{ KeyCode.?, Key.BrowserRefresh } - //{ KeyCode.?, Key.BrowserStop } - //{ KeyCode.?, Key.BrowserSearch } - //{ KeyCode.?, Key.BrowserFavorites } - //{ KeyCode.?, Key.BrowserHome } - //{ KeyCode.?, Key.VolumeMute } - //{ KeyCode.VolumeDown, Key.VolumeDown }, - //{ KeyCode.VolumeUp, Key.VolumeUp }, - //{ KeyCode.MediaNext, Key.MediaNextTrack }, - //{ KeyCode.MediaPrevious, Key.MediaPreviousTrack }, - //{ KeyCode.MediaStop, Key.MediaStop }, - //{ KeyCode.MediaPlayPause, Key.MediaPlayPause }, - //{ KeyCode.?, Key.LaunchMail } - //{ KeyCode.?, Key.SelectMedia } - //{ KeyCode.?, Key.LaunchApplication1 } - //{ KeyCode.?, Key.LaunchApplication2 } - { KeyCode.Semicolon, Key.OemSemicolon }, - { KeyCode.Plus, Key.OemPlus }, - { KeyCode.Comma, Key.OemComma }, - { KeyCode.Minus, Key.OemMinus }, - { KeyCode.Period, Key.OemPeriod }, - //{ KeyCode.?, Key.Oem2 } - { KeyCode.Grave, Key.OemTilde }, - //{ KeyCode.?, Key.AbntC1 } - //{ KeyCode.?, Key.AbntC2 } - //{ KeyCode.?, Key.OemPipe } - { KeyCode.Apostrophe, Key.OemQuotes }, - { KeyCode.Slash, Key.OemQuestion }, - { KeyCode.BraceLeft, Key.OemOpenBrackets }, - { KeyCode.BracketRight, Key.OemCloseBrackets }, - //{ KeyCode.?, Key.Oem7 } - //{ KeyCode.?, Key.Oem8 } - //{ KeyCode.?, Key.Oem102 } - //{ KeyCode.?, Key.ImeProcessed } - //{ KeyCode.?, Key.System } - //{ KeyCode.?, Key.OemAttn } - //{ KeyCode.?, Key.OemFinish } - //{ KeyCode.?, Key.DbeHiragana } - //{ KeyCode.?, Key.OemAuto } - //{ KeyCode.?, Key.DbeDbcsChar } - //{ KeyCode.?, Key.OemBackTab } - //{ KeyCode.?, Key.Attn } - //{ KeyCode.?, Key.DbeEnterWordRegisterMode } - //{ KeyCode.?, Key.DbeEnterImeConfigureMode } - //{ KeyCode.?, Key.EraseEof } - //{ KeyCode.MediaPlay, Key.Play }, - //{ KeyCode.?, Key.Zoom } - //{ KeyCode.?, Key.NoName } - //{ KeyCode.?, Key.DbeEnterDialogConversionMode } - //{ KeyCode.?, Key.OemClear } - //{ KeyCode.?, Key.DeadCharProcessed } - { KeyCode.Backslash, Key.OemBackslash } - }; + private static readonly Dictionary SpecialKeys = new Dictionary + { + // Media keys + { "XF86Red", Key.MediaRed }, + { "XF86Green", Key.MediaGreen }, + { "XF86Yellow", Key.MediaYellow }, + { "XF86Blue", Key.MediaBlue }, + { "XF86Info", Key.MediaInfo }, + { "XF86SimpleMenu", Key.MediaMenu }, + { "XF86Caption", Key.MediaSubtitle }, + { "XF86MTS", Key.None }, + { "XF86PictureSize", Key.None }, + { "XF86More", Key.MediaMore }, + { "XF86Search", Key.MediaSearch }, + { "XF863D", Key.None }, + { "XF86AudioRewind", Key.MediaPreviousTrack }, + { "XF86AudioPause", Key.MediaPlayPause }, + { "XF86AudioNext", Key.MediaNextTrack }, + { "XF86AudioRecord", Key.MediaRecord }, + { "XF86AudioPlay", Key.MediaPlayPause }, + { "XF86AudioStop", Key.MediaStop }, + { "XF86ChannelGuide", Key.MediaTvGuide }, + { "XF86SysMenu", Key.Apps }, + { "minus", Key.OemMinus }, + { "XF86PreviousChannel", Key.MediaPreviousChannel }, + { "XF86AudioMute", Key.VolumeMute }, + { "XF86ChannelList", Key.MediaChannelList }, + { "XF86RaiseChannel", Key.MediaChannelRaise }, + { "XF86LowerChannel", Key.MediaChannelLower }, + { "XF86AudioRaiseVolume", Key.VolumeUp }, + { "XF86AudioLowerVolume", Key.VolumeDown }, + { "XF86Display", Key.None }, + { "XF86PowerOff", Key.Sleep }, + { "XF86PlayBack", Key.MediaPlayPause }, + { "XF86Home", Key.MediaHome }, + { "XF86Back", Key.Back }, + { "XF86Exit", Key.Cancel }, + + { "Shift_L", Key.LeftShift }, + { "Control_L", Key.LeftCtrl }, + { "Alt_L", Key.LeftAlt }, + { "Super_L", Key.LWin }, + { "Alt_R", Key.RightAlt }, + { "Control_R", Key.RightCtrl }, + { "Shift_R", Key.RightShift }, + { "Super_R", Key.RWin }, + { "Menu", Key.Apps }, + { "Tab", Key.Tab }, + { "BackSpace", Key.Back }, + { "Return", Key.Return }, + { "Delete", Key.Delete }, + { "End", Key.End }, + { "Next", Key.Next }, + { "Prior", Key.Prior }, + { "Home", Key.Home }, + { "Insert", Key.Insert }, + { "Num_Lock", Key.NumLock }, + { "Left", Key.Left }, + { "Up", Key.Up }, + { "Right", Key.Right }, + { "Down", Key.Down }, + { "Escape", Key.Escape }, + { "Caps_Lock", Key.CapsLock }, + { "Pause", Key.Pause }, + { "Scroll_Lock", Key.Scroll }, + { "Scroll", Key.Scroll }, + + }; - internal static Key ConvertKey(KeyCode key) + internal static Key GetSpecialKey(string key) { - return KeyDic.TryGetValue(key, out var result) ? result : Key.None; + return SpecialKeys.TryGetValue(key, out var result) ? result : Key.None; } + + internal static Key GetAsciiKey(char keyCode) => keyCode switch + { + '`' or '~' => Key.Oem7, + '0' or ')' => Key.D0, + '1' or '!' => Key.D1, + '2' or '@' => Key.D2, + '3' or '#' => Key.D3, + '4' or '$' => Key.D4, + '5' or '%' => Key.D5, + '6' or '^' => Key.D6, + '7' or '&' => Key.D7, + '8' or '*' => Key.D8, + '9' or '(' => Key.D9, + '\'' or '"' => Key.OemQuotes, + '-' or '_' => Key.OemMinus, + '=' or '+' => Key.OemPlus, + '<' or ',' => Key.OemComma, + '>' or '.' => Key.OemPeriod, + ';' or ':' => Key.OemSemicolon, + '/' or '?' => Key.OemQuestion, + '[' or '{' => Key.OemOpenBrackets, + ']' or '}' => Key.OemCloseBrackets, + '\\' or '|' => Key.OemPipe, + 'a' or 'A' => Key.A, + 'b' or 'B' => Key.B, + 'c' or 'C' => Key.C, + 'd' or 'D' => Key.D, + 'e' or 'E' => Key.E, + 'f' or 'F' => Key.F, + 'g' or 'G' => Key.G, + 'h' or 'H' => Key.H, + 'i' or 'I' => Key.I, + 'j' or 'J' => Key.J, + 'k' or 'K' => Key.K, + 'l' or 'L' => Key.L, + 'm' or 'M' => Key.M, + 'n' or 'N' => Key.N, + 'o' or 'O' => Key.O, + 'p' or 'P' => Key.P, + 'q' or 'Q' => Key.Q, + 'r' or 'R' => Key.R, + 's' or 'S' => Key.S, + 't' or 'T' => Key.T, + 'u' or 'U' => Key.U, + 'v' or 'V' => Key.V, + 'w' or 'W' => Key.W, + 'x' or 'X' => Key.X, + 'y' or 'Y' => Key.Y, + 'z' or 'Z' => Key.Z, + _ => Key.None + }; }