From 93dafd420eff6150813f649875aa3a33b5886116 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 2 Apr 2023 04:11:52 +0100 Subject: [PATCH 1/3] Windows input - Added black magic --- .../Services/Input/Enums/KeyboardKey.cs | 17 +- .../Services/Input/InputKeyLedIdMap.cs | 9 +- .../Services/Input/InputService.cs | 7 + .../Providers/Input/WindowsInputProvider.cs | 4 +- .../Utilities/InputUtilities.cs | 1950 +++++------------ 5 files changed, 628 insertions(+), 1359 deletions(-) diff --git a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs index 75abc7db2..39bfbcbd2 100644 --- a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs +++ b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs @@ -532,5 +532,20 @@ public enum KeyboardKey DeadCharProcessed = 172, // 0x000000AC, /// The NumPad enter key - NumPadEnter + NumPadEnter, + + /// The NumPad divide key + NumPadDivide, + + /// The NumPad multiply key + NumPadMultiply, + + /// The NumPad subtract key + NumPadSubtract, + + /// The NumPad add key + NumPadAdd, + + /// The NumPad decimal key + NumPadDecimal, } \ No newline at end of file diff --git a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs index d04f217dc..b240c7f51 100644 --- a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs +++ b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs @@ -166,7 +166,7 @@ public static class InputKeyUtilities {KeyboardKey.OemPipe, LedId.Keyboard_Backslash}, {KeyboardKey.OemCloseBrackets, LedId.Keyboard_BracketRight}, {KeyboardKey.OemQuotes, LedId.Keyboard_ApostropheAndDoubleQuote}, - {KeyboardKey.OemBackslash, LedId.Keyboard_Custom42}, // unverified + {KeyboardKey.OemBackslash, LedId.Keyboard_NonUsBackslash}, {KeyboardKey.ImeProcessed, LedId.Keyboard_Custom43}, {KeyboardKey.System, LedId.Keyboard_Custom44}, {KeyboardKey.OemAttn, LedId.Keyboard_Custom45}, @@ -185,7 +185,12 @@ public static class InputKeyUtilities {KeyboardKey.Pa1, LedId.Keyboard_Custom57}, {KeyboardKey.OemClear, LedId.Keyboard_Custom58}, {KeyboardKey.DeadCharProcessed, LedId.Keyboard_Custom59}, - {KeyboardKey.NumPadEnter, LedId.Keyboard_NumEnter} + {KeyboardKey.NumPadEnter, LedId.Keyboard_NumEnter}, + {KeyboardKey.NumPadDecimal, LedId.Keyboard_NumPeriodAndDelete}, + {KeyboardKey.NumPadDivide, LedId.Keyboard_NumSlash}, + {KeyboardKey.NumPadMultiply, LedId.Keyboard_NumAsterisk}, + {KeyboardKey.NumPadSubtract, LedId.Keyboard_NumMinus}, + {KeyboardKey.NumPadAdd, LedId.Keyboard_NumPlus}, }; /// diff --git a/src/Artemis.Core/Services/Input/InputService.cs b/src/Artemis.Core/Services/Input/InputService.cs index 48ae607f6..fa6c983f4 100644 --- a/src/Artemis.Core/Services/Input/InputService.cs +++ b/src/Artemis.Core/Services/Input/InputService.cs @@ -269,6 +269,13 @@ internal class InputService : IInputService // Get the LED bool foundLedId = InputKeyUtilities.KeyboardKeyLedIdMap.TryGetValue(e.Key, out LedId ledId); + // If we find a backslash but the keyboard is ISO, we need to use the non-US backslash. + // The scancode is the same, but the LED ID is different + if (ledId == LedId.Keyboard_Backslash && e.Device?.PhysicalLayout == KeyboardLayoutType.ISO) + { + ledId = LedId.Keyboard_NonUsTilde; + } + ArtemisLed? led = null; if (foundLedId && e.Device != null) led = e.Device.GetLed(ledId, true); diff --git a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs index ef8f168ec..c50a626df 100644 --- a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs +++ b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Timers; @@ -98,7 +98,7 @@ public class WindowsInputProvider : InputProvider private void HandleKeyboardData(RawInputData data, RawInputKeyboardData keyboardData) { - KeyboardKey key = InputUtilities.KeyFromVirtualKey(keyboardData.Keyboard.VirutalKey); + KeyboardKey key = InputUtilities.CorrectVirtualKeyAndScanCode((uint)keyboardData.Keyboard.VirutalKey, (uint)keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags); // Debug.WriteLine($"VK: {key} ({keyboardData.Keyboard.VirutalKey}), Flags: {keyboardData.Keyboard.Flags}, Scan code: {keyboardData.Keyboard.ScanCode}"); // Sometimes we get double hits and they resolve to None, ignore those diff --git a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs index f18ff88cc..3a06fccf4 100644 --- a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using System.Text; using Artemis.Core.Services; using Microsoft.Win32; @@ -11,6 +12,135 @@ namespace Artemis.UI.Windows.Utilities; /// public static class InputUtilities { + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + private static extern short GetKeyState(int keyCode); + + [DllImport("user32.dll")] + private static extern uint MapVirtualKey(uint uCode, MapVirtualKeyMapTypes uMapType); + + [Flags] + private enum KeyStates + { + None = 0, + Down = 1, + Toggled = 2 + } + + /// + /// The set of valid MapTypes used in MapVirtualKey + /// + private enum MapVirtualKeyMapTypes : uint + { + /// + /// uCode is a virtual-key code and is translated into a scan code. + /// If it is a virtual-key code that does not distinguish between left- and + /// right-hand keys, the left-hand scan code is returned. + /// If there is no translation, the function returns 0. + /// + MAPVK_VK_TO_VSC = 0x00, + + /// + /// uCode is a scan code and is translated into a virtual-key code that + /// does not distinguish between left- and right-hand keys. If there is no + /// translation, the function returns 0. + /// + MAPVK_VSC_TO_VK = 0x01, + + /// + /// uCode is a virtual-key code and is translated into an unshifted + /// character value in the low-order word of the return value. Dead keys (diacritics) + /// are indicated by setting the top bit of the return value. If there is no + /// translation, the function returns 0. + /// + MAPVK_VK_TO_CHAR = 0x02, + + /// + /// Windows NT/2000/XP: uCode is a scan code and is translated into a + /// virtual-key code that distinguishes between left- and right-hand keys. If + /// there is no translation, the function returns 0. + /// + MAPVK_VSC_TO_VK_EX = 0x03, + + /// + /// Not currently documented + /// + MAPVK_VK_TO_VSC_EX = 0x04 + } + + /// + /// https://blog.molecular-matters.com/2011/09/05/properly-handling-keyboard-input/ + /// + public static KeyboardKey CorrectVirtualKeyAndScanCode(uint virtualKey, uint scanCode, uint flags) + { + if (virtualKey == 255) + { + // discard "fake keys" which are part of an escaped sequence + return KeyboardKey.None; + } + + if (virtualKey == NativeMethods.VK_CONTROL && scanCode == 0x38) + { + //fake altgr ctrl + return KeyboardKey.None; + } + + if (virtualKey == NativeMethods.VK_SHIFT) + { + // correct left-hand / right-hand SHIFT + virtualKey = MapVirtualKey(scanCode, MapVirtualKeyMapTypes.MAPVK_VSC_TO_VK); + } + else if (virtualKey == NativeMethods.VK_NUMLOCK) + { + // correct PAUSE/BREAK and NUM LOCK silliness, and set the extended bit + scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC) | 0x100; + } + + const byte RI_KEY_E0 = 0x02; + const byte RI_KEY_E1 = 0x04; + bool isE0 = (flags & RI_KEY_E0) != 0; + bool isE1 = (flags & RI_KEY_E1) != 0; + + if (isE1) + { + if (virtualKey == NativeMethods.VK_PAUSE) + { + scanCode = 0x45; + } + else + { + scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC); + } + } + KeyboardKey key = (short)virtualKey switch + { + NativeMethods.VK_CONTROL => isE0 ? KeyboardKey.RightCtrl : KeyboardKey.LeftCtrl, + NativeMethods.VK_MENU => isE0 ? KeyboardKey.RightAlt : KeyboardKey.LeftAlt, + NativeMethods.VK_RETURN => isE0 ? KeyboardKey.NumPadEnter : KeyboardKey.Enter, + NativeMethods.VK_INSERT => !isE0 ? KeyboardKey.NumPad0 : KeyboardKey.Insert, + NativeMethods.VK_DELETE => !isE0 ? KeyboardKey.NumPadDecimal : KeyboardKey.Delete, + NativeMethods.VK_HOME => !isE0 ? KeyboardKey.NumPad7 : KeyboardKey.Home, + NativeMethods.VK_END => !isE0 ? KeyboardKey.NumPad1 : KeyboardKey.End, + NativeMethods.VK_PRIOR => !isE0 ? KeyboardKey.NumPad9 : KeyboardKey.PageUp, + NativeMethods.VK_NEXT => !isE0 ? KeyboardKey.NumPad3 : KeyboardKey.PageDown, + NativeMethods.VK_LEFT => !isE0 ? KeyboardKey.NumPad4 : KeyboardKey.Left, + NativeMethods.VK_RIGHT => !isE0 ? KeyboardKey.NumPad6 : KeyboardKey.Right, + NativeMethods.VK_UP => !isE0 ? KeyboardKey.NumPad8 : KeyboardKey.Up, + NativeMethods.VK_DOWN => !isE0 ? KeyboardKey.NumPad2 : KeyboardKey.Down, + NativeMethods.VK_CLEAR => !isE0 ? KeyboardKey.NumPad5 : KeyboardKey.Clear, + NativeMethods.VK_DIVIDE => isE0 ? KeyboardKey.NumPadDivide : KeyboardKey.Divide, + NativeMethods.VK_MULTIPLY => isE0 ? KeyboardKey.NumPadMultiply : KeyboardKey.Multiply, + _ => KeyboardKey.None + }; + if (key != KeyboardKey.None) + return key; + + key = KeyFromScanCode(scanCode); + if (key != KeyboardKey.None) + return key; + + return KeyFromVirtualKey((int)virtualKey); + + } public static bool IsKeyDown(KeyboardKey key) { return KeyStates.Down == (GetKeyState(key) & KeyStates.Down); @@ -21,1355 +151,6 @@ public static class InputUtilities return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled); } - /// - /// Convert a Win32 VirtualKey into our Key enum. - /// - public static KeyboardKey KeyFromVirtualKey(int virtualKey) - { - KeyboardKey key = KeyboardKey.None; - - switch (virtualKey) - { - case NativeMethods.VK_CANCEL: - key = KeyboardKey.Cancel; - break; - - case NativeMethods.VK_BACK: - key = KeyboardKey.Back; - break; - - case NativeMethods.VK_TAB: - key = KeyboardKey.Tab; - break; - - case NativeMethods.VK_CLEAR: - key = KeyboardKey.Clear; - break; - - case NativeMethods.VK_RETURN: - key = KeyboardKey.Return; - break; - - case NativeMethods.VK_PAUSE: - key = KeyboardKey.Pause; - break; - - case NativeMethods.VK_CAPSLOCK: - key = KeyboardKey.CapsLock; - break; - - case NativeMethods.VK_JUNJA: - key = KeyboardKey.JunjaMode; - break; - - case NativeMethods.VK_FINAL: - key = KeyboardKey.FinalMode; - break; - - case NativeMethods.VK_ESCAPE: - key = KeyboardKey.Escape; - break; - - case NativeMethods.VK_CONVERT: - key = KeyboardKey.ImeConvert; - break; - - case NativeMethods.VK_NONCONVERT: - key = KeyboardKey.ImeNonConvert; - break; - - case NativeMethods.VK_ACCEPT: - key = KeyboardKey.ImeAccept; - break; - - case NativeMethods.VK_MODECHANGE: - key = KeyboardKey.ImeModeChange; - break; - - case NativeMethods.VK_SPACE: - key = KeyboardKey.Space; - break; - - case NativeMethods.VK_PRIOR: - key = KeyboardKey.Prior; - break; - - case NativeMethods.VK_NEXT: - key = KeyboardKey.Next; - break; - - case NativeMethods.VK_END: - key = KeyboardKey.End; - break; - - case NativeMethods.VK_HOME: - key = KeyboardKey.Home; - break; - - case NativeMethods.VK_LEFT: - key = KeyboardKey.Left; - break; - - case NativeMethods.VK_UP: - key = KeyboardKey.Up; - break; - - case NativeMethods.VK_RIGHT: - key = KeyboardKey.Right; - break; - - case NativeMethods.VK_DOWN: - key = KeyboardKey.Down; - break; - - case NativeMethods.VK_SELECT: - key = KeyboardKey.Select; - break; - - case NativeMethods.VK_PRINT: - key = KeyboardKey.Print; - break; - - case NativeMethods.VK_EXECUTE: - key = KeyboardKey.Execute; - break; - - case NativeMethods.VK_INSERT: - key = KeyboardKey.Insert; - break; - - case NativeMethods.VK_DELETE: - key = KeyboardKey.Delete; - break; - - case NativeMethods.VK_HELP: - key = KeyboardKey.Help; - break; - - case NativeMethods.VK_0: - key = KeyboardKey.D0; - break; - - case NativeMethods.VK_1: - key = KeyboardKey.D1; - break; - - case NativeMethods.VK_2: - key = KeyboardKey.D2; - break; - - case NativeMethods.VK_3: - key = KeyboardKey.D3; - break; - - case NativeMethods.VK_4: - key = KeyboardKey.D4; - break; - - case NativeMethods.VK_5: - key = KeyboardKey.D5; - break; - - case NativeMethods.VK_6: - key = KeyboardKey.D6; - break; - - case NativeMethods.VK_7: - key = KeyboardKey.D7; - break; - - case NativeMethods.VK_8: - key = KeyboardKey.D8; - break; - - case NativeMethods.VK_9: - key = KeyboardKey.D9; - break; - - case NativeMethods.VK_A: - key = KeyboardKey.A; - break; - - case NativeMethods.VK_B: - key = KeyboardKey.B; - break; - - case NativeMethods.VK_C: - key = KeyboardKey.C; - break; - - case NativeMethods.VK_D: - key = KeyboardKey.D; - break; - - case NativeMethods.VK_E: - key = KeyboardKey.E; - break; - - case NativeMethods.VK_F: - key = KeyboardKey.F; - break; - - case NativeMethods.VK_G: - key = KeyboardKey.G; - break; - - case NativeMethods.VK_H: - key = KeyboardKey.H; - break; - - case NativeMethods.VK_I: - key = KeyboardKey.I; - break; - - case NativeMethods.VK_J: - key = KeyboardKey.J; - break; - - case NativeMethods.VK_K: - key = KeyboardKey.K; - break; - - case NativeMethods.VK_L: - key = KeyboardKey.L; - break; - - case NativeMethods.VK_M: - key = KeyboardKey.M; - break; - - case NativeMethods.VK_N: - key = KeyboardKey.N; - break; - - case NativeMethods.VK_O: - key = KeyboardKey.O; - break; - - case NativeMethods.VK_P: - key = KeyboardKey.P; - break; - - case NativeMethods.VK_Q: - key = KeyboardKey.Q; - break; - - case NativeMethods.VK_R: - key = KeyboardKey.R; - break; - - case NativeMethods.VK_S: - key = KeyboardKey.S; - break; - - case NativeMethods.VK_T: - key = KeyboardKey.T; - break; - - case NativeMethods.VK_U: - key = KeyboardKey.U; - break; - - case NativeMethods.VK_V: - key = KeyboardKey.V; - break; - - case NativeMethods.VK_W: - key = KeyboardKey.W; - break; - - case NativeMethods.VK_X: - key = KeyboardKey.X; - break; - - case NativeMethods.VK_Y: - key = KeyboardKey.Y; - break; - - case NativeMethods.VK_Z: - key = KeyboardKey.Z; - break; - - case NativeMethods.VK_LWIN: - key = KeyboardKey.LWin; - break; - - case NativeMethods.VK_RWIN: - key = KeyboardKey.RWin; - break; - - case NativeMethods.VK_APPS: - key = KeyboardKey.Apps; - break; - - case NativeMethods.VK_SLEEP: - key = KeyboardKey.Sleep; - break; - - case NativeMethods.VK_NUMPAD0: - key = KeyboardKey.NumPad0; - break; - - case NativeMethods.VK_NUMPAD1: - key = KeyboardKey.NumPad1; - break; - - case NativeMethods.VK_NUMPAD2: - key = KeyboardKey.NumPad2; - break; - - case NativeMethods.VK_NUMPAD3: - key = KeyboardKey.NumPad3; - break; - - case NativeMethods.VK_NUMPAD4: - key = KeyboardKey.NumPad4; - break; - - case NativeMethods.VK_NUMPAD5: - key = KeyboardKey.NumPad5; - break; - - case NativeMethods.VK_NUMPAD6: - key = KeyboardKey.NumPad6; - break; - - case NativeMethods.VK_NUMPAD7: - key = KeyboardKey.NumPad7; - break; - - case NativeMethods.VK_NUMPAD8: - key = KeyboardKey.NumPad8; - break; - - case NativeMethods.VK_NUMPAD9: - key = KeyboardKey.NumPad9; - break; - - case NativeMethods.VK_MULTIPLY: - key = KeyboardKey.Multiply; - break; - - case NativeMethods.VK_ADD: - key = KeyboardKey.Add; - break; - - case NativeMethods.VK_SEPARATOR: - key = KeyboardKey.Separator; - break; - - case NativeMethods.VK_SUBTRACT: - key = KeyboardKey.Subtract; - break; - - case NativeMethods.VK_DECIMAL: - key = KeyboardKey.Decimal; - break; - - case NativeMethods.VK_DIVIDE: - key = KeyboardKey.Divide; - break; - - case NativeMethods.VK_F1: - key = KeyboardKey.F1; - break; - - case NativeMethods.VK_F2: - key = KeyboardKey.F2; - break; - - case NativeMethods.VK_F3: - key = KeyboardKey.F3; - break; - - case NativeMethods.VK_F4: - key = KeyboardKey.F4; - break; - - case NativeMethods.VK_F5: - key = KeyboardKey.F5; - break; - - case NativeMethods.VK_F6: - key = KeyboardKey.F6; - break; - - case NativeMethods.VK_F7: - key = KeyboardKey.F7; - break; - - case NativeMethods.VK_F8: - key = KeyboardKey.F8; - break; - - case NativeMethods.VK_F9: - key = KeyboardKey.F9; - break; - - case NativeMethods.VK_F10: - key = KeyboardKey.F10; - break; - - case NativeMethods.VK_F11: - key = KeyboardKey.F11; - break; - - case NativeMethods.VK_F12: - key = KeyboardKey.F12; - break; - - case NativeMethods.VK_F13: - key = KeyboardKey.F13; - break; - - case NativeMethods.VK_F14: - key = KeyboardKey.F14; - break; - - case NativeMethods.VK_F15: - key = KeyboardKey.F15; - break; - - case NativeMethods.VK_F16: - key = KeyboardKey.F16; - break; - - case NativeMethods.VK_F17: - key = KeyboardKey.F17; - break; - - case NativeMethods.VK_F18: - key = KeyboardKey.F18; - break; - - case NativeMethods.VK_F19: - key = KeyboardKey.F19; - break; - - case NativeMethods.VK_F20: - key = KeyboardKey.F20; - break; - - case NativeMethods.VK_F21: - key = KeyboardKey.F21; - break; - - case NativeMethods.VK_F22: - key = KeyboardKey.F22; - break; - - case NativeMethods.VK_F23: - key = KeyboardKey.F23; - break; - - case NativeMethods.VK_F24: - key = KeyboardKey.F24; - break; - - case NativeMethods.VK_NUMLOCK: - key = KeyboardKey.NumLock; - break; - - case NativeMethods.VK_SCROLL: - key = KeyboardKey.Scroll; - break; - - case NativeMethods.VK_SHIFT: - case NativeMethods.VK_LSHIFT: - key = KeyboardKey.LeftShift; - break; - - case NativeMethods.VK_RSHIFT: - key = KeyboardKey.RightShift; - break; - - case NativeMethods.VK_CONTROL: - case NativeMethods.VK_LCONTROL: - key = KeyboardKey.LeftCtrl; - break; - - case NativeMethods.VK_RCONTROL: - key = KeyboardKey.RightCtrl; - break; - - case NativeMethods.VK_MENU: - case NativeMethods.VK_LMENU: - key = KeyboardKey.LeftAlt; - break; - - case NativeMethods.VK_RMENU: - key = KeyboardKey.RightAlt; - break; - - case NativeMethods.VK_BROWSER_BACK: - key = KeyboardKey.BrowserBack; - break; - - case NativeMethods.VK_BROWSER_FORWARD: - key = KeyboardKey.BrowserForward; - break; - - case NativeMethods.VK_BROWSER_REFRESH: - key = KeyboardKey.BrowserRefresh; - break; - - case NativeMethods.VK_BROWSER_STOP: - key = KeyboardKey.BrowserStop; - break; - - case NativeMethods.VK_BROWSER_SEARCH: - key = KeyboardKey.BrowserSearch; - break; - - case NativeMethods.VK_BROWSER_FAVORITES: - key = KeyboardKey.BrowserFavorites; - break; - - case NativeMethods.VK_BROWSER_HOME: - key = KeyboardKey.BrowserHome; - break; - - case NativeMethods.VK_VOLUME_MUTE: - key = KeyboardKey.VolumeMute; - break; - - case NativeMethods.VK_VOLUME_DOWN: - key = KeyboardKey.VolumeDown; - break; - - case NativeMethods.VK_VOLUME_UP: - key = KeyboardKey.VolumeUp; - break; - - case NativeMethods.VK_MEDIA_NEXT_TRACK: - key = KeyboardKey.MediaNextTrack; - break; - - case NativeMethods.VK_MEDIA_PREV_TRACK: - key = KeyboardKey.MediaPreviousTrack; - break; - - case NativeMethods.VK_MEDIA_STOP: - key = KeyboardKey.MediaStop; - break; - - case NativeMethods.VK_MEDIA_PLAY_PAUSE: - key = KeyboardKey.MediaPlayPause; - break; - - case NativeMethods.VK_LAUNCH_MAIL: - key = KeyboardKey.LaunchMail; - break; - - case NativeMethods.VK_LAUNCH_MEDIA_SELECT: - key = KeyboardKey.SelectMedia; - break; - - case NativeMethods.VK_LAUNCH_APP1: - key = KeyboardKey.LaunchApplication1; - break; - - case NativeMethods.VK_LAUNCH_APP2: - key = KeyboardKey.LaunchApplication2; - break; - - case NativeMethods.VK_OEM_1: - key = KeyboardKey.OemSemicolon; - break; - - case NativeMethods.VK_OEM_PLUS: - key = KeyboardKey.OemPlus; - break; - - case NativeMethods.VK_OEM_COMMA: - key = KeyboardKey.OemComma; - break; - - case NativeMethods.VK_OEM_MINUS: - key = KeyboardKey.OemMinus; - break; - - case NativeMethods.VK_OEM_PERIOD: - key = KeyboardKey.OemPeriod; - break; - - case NativeMethods.VK_OEM_2: - key = KeyboardKey.OemQuestion; - break; - - case NativeMethods.VK_OEM_3: - key = KeyboardKey.OemTilde; - break; - - - case NativeMethods.VK_OEM_4: - key = KeyboardKey.OemOpenBrackets; - break; - - case NativeMethods.VK_OEM_5: - key = KeyboardKey.OemPipe; - break; - - case NativeMethods.VK_OEM_6: - key = KeyboardKey.OemCloseBrackets; - break; - - case NativeMethods.VK_OEM_7: - key = KeyboardKey.OemQuotes; - break; - - case NativeMethods.VK_OEM_102: - key = KeyboardKey.OemBackslash; - break; - - case NativeMethods.VK_PROCESSKEY: - key = KeyboardKey.ImeProcessed; - break; - - case NativeMethods.VK_OEM_ATTN: // VK_DBE_ALPHANUMERIC - key = KeyboardKey.OemAttn; // DbeAlphanumeric - break; - - case NativeMethods.VK_OEM_FINISH: // VK_DBE_KATAKANA - key = KeyboardKey.OemFinish; // DbeKatakana - break; - - case NativeMethods.VK_OEM_COPY: // VK_DBE_HIRAGANA - key = KeyboardKey.OemCopy; // DbeHiragana - break; - - case NativeMethods.VK_OEM_AUTO: // VK_DBE_SBCSCHAR - key = KeyboardKey.OemAuto; // DbeSbcsChar - break; - - case NativeMethods.VK_OEM_ENLW: // VK_DBE_DBCSCHAR - key = KeyboardKey.OemEnlw; // DbeDbcsChar - break; - - case NativeMethods.VK_OEM_BACKTAB: // VK_DBE_ROMAN - key = KeyboardKey.OemBackTab; // DbeRoman - break; - - case NativeMethods.VK_ATTN: // VK_DBE_NOROMAN - key = KeyboardKey.Attn; // DbeNoRoman - break; - - case NativeMethods.VK_CRSEL: // VK_DBE_ENTERWORDREGISTERMODE - key = KeyboardKey.CrSel; // DbeEnterWordRegisterMode - break; - - case NativeMethods.VK_EXSEL: // VK_DBE_ENTERIMECONFIGMODE - key = KeyboardKey.ExSel; // DbeEnterImeConfigMode - break; - - case NativeMethods.VK_EREOF: // VK_DBE_FLUSHSTRING - key = KeyboardKey.EraseEof; // DbeFlushString - break; - - case NativeMethods.VK_PLAY: // VK_DBE_CODEINPUT - key = KeyboardKey.Play; // DbeCodeInput - break; - - case NativeMethods.VK_ZOOM: // VK_DBE_NOCODEINPUT - key = KeyboardKey.Zoom; // DbeNoCodeInput - break; - - case NativeMethods.VK_NONAME: // VK_DBE_DETERMINESTRING - key = KeyboardKey.NoName; // DbeDetermineString - break; - - case NativeMethods.VK_PA1: // VK_DBE_ENTERDLGCONVERSIONMODE - key = KeyboardKey.Pa1; // DbeEnterDlgConversionMode - break; - - case NativeMethods.VK_OEM_CLEAR: - key = KeyboardKey.OemClear; - break; - - default: - key = KeyboardKey.None; - break; - } - - return key; - } - - /// - /// Convert our Key enum into a Win32 VirtualKeyboardKey. - /// - public static int VirtualKeyFromKey(KeyboardKey key) - { - int virtualKey = 0; - - switch (key) - { - case KeyboardKey.Cancel: - virtualKey = NativeMethods.VK_CANCEL; - break; - - case KeyboardKey.Back: - virtualKey = NativeMethods.VK_BACK; - break; - - case KeyboardKey.Tab: - virtualKey = NativeMethods.VK_TAB; - break; - - case KeyboardKey.Clear: - virtualKey = NativeMethods.VK_CLEAR; - break; - - case KeyboardKey.Return: - virtualKey = NativeMethods.VK_RETURN; - break; - - case KeyboardKey.Pause: - virtualKey = NativeMethods.VK_PAUSE; - break; - - case KeyboardKey.CapsLock: - virtualKey = NativeMethods.VK_CAPSLOCK; - break; - - case KeyboardKey.JunjaMode: - virtualKey = NativeMethods.VK_JUNJA; - break; - - case KeyboardKey.FinalMode: - virtualKey = NativeMethods.VK_FINAL; - break; - - case KeyboardKey.Escape: - virtualKey = NativeMethods.VK_ESCAPE; - break; - - case KeyboardKey.ImeConvert: - virtualKey = NativeMethods.VK_CONVERT; - break; - - case KeyboardKey.ImeNonConvert: - virtualKey = NativeMethods.VK_NONCONVERT; - break; - - case KeyboardKey.ImeAccept: - virtualKey = NativeMethods.VK_ACCEPT; - break; - - case KeyboardKey.ImeModeChange: - virtualKey = NativeMethods.VK_MODECHANGE; - break; - - case KeyboardKey.Space: - virtualKey = NativeMethods.VK_SPACE; - break; - - case KeyboardKey.Prior: - virtualKey = NativeMethods.VK_PRIOR; - break; - - case KeyboardKey.Next: - virtualKey = NativeMethods.VK_NEXT; - break; - - case KeyboardKey.End: - virtualKey = NativeMethods.VK_END; - break; - - case KeyboardKey.Home: - virtualKey = NativeMethods.VK_HOME; - break; - - case KeyboardKey.Left: - virtualKey = NativeMethods.VK_LEFT; - break; - - case KeyboardKey.Up: - virtualKey = NativeMethods.VK_UP; - break; - - case KeyboardKey.Right: - virtualKey = NativeMethods.VK_RIGHT; - break; - - case KeyboardKey.Down: - virtualKey = NativeMethods.VK_DOWN; - break; - - case KeyboardKey.Select: - virtualKey = NativeMethods.VK_SELECT; - break; - - case KeyboardKey.Print: - virtualKey = NativeMethods.VK_PRINT; - break; - - case KeyboardKey.Execute: - virtualKey = NativeMethods.VK_EXECUTE; - break; - - case KeyboardKey.Insert: - virtualKey = NativeMethods.VK_INSERT; - break; - - case KeyboardKey.Delete: - virtualKey = NativeMethods.VK_DELETE; - break; - - case KeyboardKey.Help: - virtualKey = NativeMethods.VK_HELP; - break; - - case KeyboardKey.D0: - virtualKey = NativeMethods.VK_0; - break; - - case KeyboardKey.D1: - virtualKey = NativeMethods.VK_1; - break; - - case KeyboardKey.D2: - virtualKey = NativeMethods.VK_2; - break; - - case KeyboardKey.D3: - virtualKey = NativeMethods.VK_3; - break; - - case KeyboardKey.D4: - virtualKey = NativeMethods.VK_4; - break; - - case KeyboardKey.D5: - virtualKey = NativeMethods.VK_5; - break; - - case KeyboardKey.D6: - virtualKey = NativeMethods.VK_6; - break; - - case KeyboardKey.D7: - virtualKey = NativeMethods.VK_7; - break; - - case KeyboardKey.D8: - virtualKey = NativeMethods.VK_8; - break; - - case KeyboardKey.D9: - virtualKey = NativeMethods.VK_9; - break; - - case KeyboardKey.A: - virtualKey = NativeMethods.VK_A; - break; - - case KeyboardKey.B: - virtualKey = NativeMethods.VK_B; - break; - - case KeyboardKey.C: - virtualKey = NativeMethods.VK_C; - break; - - case KeyboardKey.D: - virtualKey = NativeMethods.VK_D; - break; - - case KeyboardKey.E: - virtualKey = NativeMethods.VK_E; - break; - - case KeyboardKey.F: - virtualKey = NativeMethods.VK_F; - break; - - case KeyboardKey.G: - virtualKey = NativeMethods.VK_G; - break; - - case KeyboardKey.H: - virtualKey = NativeMethods.VK_H; - break; - - case KeyboardKey.I: - virtualKey = NativeMethods.VK_I; - break; - - case KeyboardKey.J: - virtualKey = NativeMethods.VK_J; - break; - - case KeyboardKey.K: - virtualKey = NativeMethods.VK_K; - break; - - case KeyboardKey.L: - virtualKey = NativeMethods.VK_L; - break; - - case KeyboardKey.M: - virtualKey = NativeMethods.VK_M; - break; - - case KeyboardKey.N: - virtualKey = NativeMethods.VK_N; - break; - - case KeyboardKey.O: - virtualKey = NativeMethods.VK_O; - break; - - case KeyboardKey.P: - virtualKey = NativeMethods.VK_P; - break; - - case KeyboardKey.Q: - virtualKey = NativeMethods.VK_Q; - break; - - case KeyboardKey.R: - virtualKey = NativeMethods.VK_R; - break; - - case KeyboardKey.S: - virtualKey = NativeMethods.VK_S; - break; - - case KeyboardKey.T: - virtualKey = NativeMethods.VK_T; - break; - - case KeyboardKey.U: - virtualKey = NativeMethods.VK_U; - break; - - case KeyboardKey.V: - virtualKey = NativeMethods.VK_V; - break; - - case KeyboardKey.W: - virtualKey = NativeMethods.VK_W; - break; - - case KeyboardKey.X: - virtualKey = NativeMethods.VK_X; - break; - - case KeyboardKey.Y: - virtualKey = NativeMethods.VK_Y; - break; - - case KeyboardKey.Z: - virtualKey = NativeMethods.VK_Z; - break; - - case KeyboardKey.LWin: - virtualKey = NativeMethods.VK_LWIN; - break; - - case KeyboardKey.RWin: - virtualKey = NativeMethods.VK_RWIN; - break; - - case KeyboardKey.Apps: - virtualKey = NativeMethods.VK_APPS; - break; - - case KeyboardKey.Sleep: - virtualKey = NativeMethods.VK_SLEEP; - break; - - case KeyboardKey.NumPad0: - virtualKey = NativeMethods.VK_NUMPAD0; - break; - - case KeyboardKey.NumPad1: - virtualKey = NativeMethods.VK_NUMPAD1; - break; - - case KeyboardKey.NumPad2: - virtualKey = NativeMethods.VK_NUMPAD2; - break; - - case KeyboardKey.NumPad3: - virtualKey = NativeMethods.VK_NUMPAD3; - break; - - case KeyboardKey.NumPad4: - virtualKey = NativeMethods.VK_NUMPAD4; - break; - - case KeyboardKey.NumPad5: - virtualKey = NativeMethods.VK_NUMPAD5; - break; - - case KeyboardKey.NumPad6: - virtualKey = NativeMethods.VK_NUMPAD6; - break; - - case KeyboardKey.NumPad7: - virtualKey = NativeMethods.VK_NUMPAD7; - break; - - case KeyboardKey.NumPad8: - virtualKey = NativeMethods.VK_NUMPAD8; - break; - - case KeyboardKey.NumPad9: - virtualKey = NativeMethods.VK_NUMPAD9; - break; - - case KeyboardKey.Multiply: - virtualKey = NativeMethods.VK_MULTIPLY; - break; - - case KeyboardKey.Add: - virtualKey = NativeMethods.VK_ADD; - break; - - case KeyboardKey.Separator: - virtualKey = NativeMethods.VK_SEPARATOR; - break; - - case KeyboardKey.Subtract: - virtualKey = NativeMethods.VK_SUBTRACT; - break; - - case KeyboardKey.Decimal: - virtualKey = NativeMethods.VK_DECIMAL; - break; - - case KeyboardKey.Divide: - virtualKey = NativeMethods.VK_DIVIDE; - break; - - case KeyboardKey.F1: - virtualKey = NativeMethods.VK_F1; - break; - - case KeyboardKey.F2: - virtualKey = NativeMethods.VK_F2; - break; - - case KeyboardKey.F3: - virtualKey = NativeMethods.VK_F3; - break; - - case KeyboardKey.F4: - virtualKey = NativeMethods.VK_F4; - break; - - case KeyboardKey.F5: - virtualKey = NativeMethods.VK_F5; - break; - - case KeyboardKey.F6: - virtualKey = NativeMethods.VK_F6; - break; - - case KeyboardKey.F7: - virtualKey = NativeMethods.VK_F7; - break; - - case KeyboardKey.F8: - virtualKey = NativeMethods.VK_F8; - break; - - case KeyboardKey.F9: - virtualKey = NativeMethods.VK_F9; - break; - - case KeyboardKey.F10: - virtualKey = NativeMethods.VK_F10; - break; - - case KeyboardKey.F11: - virtualKey = NativeMethods.VK_F11; - break; - - case KeyboardKey.F12: - virtualKey = NativeMethods.VK_F12; - break; - - case KeyboardKey.F13: - virtualKey = NativeMethods.VK_F13; - break; - - case KeyboardKey.F14: - virtualKey = NativeMethods.VK_F14; - break; - - case KeyboardKey.F15: - virtualKey = NativeMethods.VK_F15; - break; - - case KeyboardKey.F16: - virtualKey = NativeMethods.VK_F16; - break; - - case KeyboardKey.F17: - virtualKey = NativeMethods.VK_F17; - break; - - case KeyboardKey.F18: - virtualKey = NativeMethods.VK_F18; - break; - - case KeyboardKey.F19: - virtualKey = NativeMethods.VK_F19; - break; - - case KeyboardKey.F20: - virtualKey = NativeMethods.VK_F20; - break; - - case KeyboardKey.F21: - virtualKey = NativeMethods.VK_F21; - break; - - case KeyboardKey.F22: - virtualKey = NativeMethods.VK_F22; - break; - - case KeyboardKey.F23: - virtualKey = NativeMethods.VK_F23; - break; - - case KeyboardKey.F24: - virtualKey = NativeMethods.VK_F24; - break; - - case KeyboardKey.NumLock: - virtualKey = NativeMethods.VK_NUMLOCK; - break; - - case KeyboardKey.Scroll: - virtualKey = NativeMethods.VK_SCROLL; - break; - - case KeyboardKey.LeftShift: - virtualKey = NativeMethods.VK_LSHIFT; - break; - - case KeyboardKey.RightShift: - virtualKey = NativeMethods.VK_RSHIFT; - break; - - case KeyboardKey.LeftCtrl: - virtualKey = NativeMethods.VK_LCONTROL; - break; - - case KeyboardKey.RightCtrl: - virtualKey = NativeMethods.VK_RCONTROL; - break; - - case KeyboardKey.LeftAlt: - virtualKey = NativeMethods.VK_LMENU; - break; - - case KeyboardKey.RightAlt: - virtualKey = NativeMethods.VK_RMENU; - break; - - case KeyboardKey.BrowserBack: - virtualKey = NativeMethods.VK_BROWSER_BACK; - break; - - case KeyboardKey.BrowserForward: - virtualKey = NativeMethods.VK_BROWSER_FORWARD; - break; - - case KeyboardKey.BrowserRefresh: - virtualKey = NativeMethods.VK_BROWSER_REFRESH; - break; - - case KeyboardKey.BrowserStop: - virtualKey = NativeMethods.VK_BROWSER_STOP; - break; - - case KeyboardKey.BrowserSearch: - virtualKey = NativeMethods.VK_BROWSER_SEARCH; - break; - - case KeyboardKey.BrowserFavorites: - virtualKey = NativeMethods.VK_BROWSER_FAVORITES; - break; - - case KeyboardKey.BrowserHome: - virtualKey = NativeMethods.VK_BROWSER_HOME; - break; - - case KeyboardKey.VolumeMute: - virtualKey = NativeMethods.VK_VOLUME_MUTE; - break; - - case KeyboardKey.VolumeDown: - virtualKey = NativeMethods.VK_VOLUME_DOWN; - break; - - case KeyboardKey.VolumeUp: - virtualKey = NativeMethods.VK_VOLUME_UP; - break; - - case KeyboardKey.MediaNextTrack: - virtualKey = NativeMethods.VK_MEDIA_NEXT_TRACK; - break; - - case KeyboardKey.MediaPreviousTrack: - virtualKey = NativeMethods.VK_MEDIA_PREV_TRACK; - break; - - case KeyboardKey.MediaStop: - virtualKey = NativeMethods.VK_MEDIA_STOP; - break; - - case KeyboardKey.MediaPlayPause: - virtualKey = NativeMethods.VK_MEDIA_PLAY_PAUSE; - break; - - case KeyboardKey.LaunchMail: - virtualKey = NativeMethods.VK_LAUNCH_MAIL; - break; - - case KeyboardKey.SelectMedia: - virtualKey = NativeMethods.VK_LAUNCH_MEDIA_SELECT; - break; - - case KeyboardKey.LaunchApplication1: - virtualKey = NativeMethods.VK_LAUNCH_APP1; - break; - - case KeyboardKey.LaunchApplication2: - virtualKey = NativeMethods.VK_LAUNCH_APP2; - break; - - case KeyboardKey.OemSemicolon: - virtualKey = NativeMethods.VK_OEM_1; - break; - - case KeyboardKey.OemPlus: - virtualKey = NativeMethods.VK_OEM_PLUS; - break; - - case KeyboardKey.OemComma: - virtualKey = NativeMethods.VK_OEM_COMMA; - break; - - case KeyboardKey.OemMinus: - virtualKey = NativeMethods.VK_OEM_MINUS; - break; - - case KeyboardKey.OemPeriod: - virtualKey = NativeMethods.VK_OEM_PERIOD; - break; - - case KeyboardKey.OemQuestion: - virtualKey = NativeMethods.VK_OEM_2; - break; - - case KeyboardKey.OemTilde: - virtualKey = NativeMethods.VK_OEM_3; - break; - - case KeyboardKey.OemOpenBrackets: - virtualKey = NativeMethods.VK_OEM_4; - break; - - case KeyboardKey.OemPipe: - virtualKey = NativeMethods.VK_OEM_5; - break; - - case KeyboardKey.OemCloseBrackets: - virtualKey = NativeMethods.VK_OEM_6; - break; - - case KeyboardKey.OemQuotes: - virtualKey = NativeMethods.VK_OEM_7; - break; - - case KeyboardKey.OemBackslash: - virtualKey = NativeMethods.VK_OEM_102; - break; - - case KeyboardKey.ImeProcessed: - virtualKey = NativeMethods.VK_PROCESSKEY; - break; - - case KeyboardKey.OemAttn: // DbeAlphanumeric - virtualKey = NativeMethods.VK_OEM_ATTN; // VK_DBE_ALPHANUMERIC - break; - - case KeyboardKey.OemFinish: // DbeKatakana - virtualKey = NativeMethods.VK_OEM_FINISH; // VK_DBE_KATAKANA - break; - - case KeyboardKey.OemCopy: // DbeHiragana - virtualKey = NativeMethods.VK_OEM_COPY; // VK_DBE_HIRAGANA - break; - - case KeyboardKey.OemAuto: // DbeSbcsChar - virtualKey = NativeMethods.VK_OEM_AUTO; // VK_DBE_SBCSCHAR - break; - - case KeyboardKey.OemEnlw: // DbeDbcsChar - virtualKey = NativeMethods.VK_OEM_ENLW; // VK_DBE_DBCSCHAR - break; - - case KeyboardKey.OemBackTab: // DbeRoman - virtualKey = NativeMethods.VK_OEM_BACKTAB; // VK_DBE_ROMAN - break; - - case KeyboardKey.Attn: // DbeNoRoman - virtualKey = NativeMethods.VK_ATTN; // VK_DBE_NOROMAN - break; - - case KeyboardKey.CrSel: // DbeEnterWordRegisterMode - virtualKey = NativeMethods.VK_CRSEL; // VK_DBE_ENTERWORDREGISTERMODE - break; - - case KeyboardKey.ExSel: // EnterImeConfigureMode - virtualKey = NativeMethods.VK_EXSEL; // VK_DBE_ENTERIMECONFIGMODE - break; - - case KeyboardKey.EraseEof: // DbeFlushString - virtualKey = NativeMethods.VK_EREOF; // VK_DBE_FLUSHSTRING - break; - - case KeyboardKey.Play: // DbeCodeInput - virtualKey = NativeMethods.VK_PLAY; // VK_DBE_CODEINPUT - break; - - case KeyboardKey.Zoom: // DbeNoCodeInput - virtualKey = NativeMethods.VK_ZOOM; // VK_DBE_NOCODEINPUT - break; - - case KeyboardKey.NoName: // DbeDetermineString - virtualKey = NativeMethods.VK_NONAME; // VK_DBE_DETERMINESTRING - break; - - case KeyboardKey.Pa1: // DbeEnterDlgConversionMode - virtualKey = NativeMethods.VK_PA1; // VK_ENTERDLGCONVERSIONMODE - break; - - case KeyboardKey.OemClear: - virtualKey = NativeMethods.VK_OEM_CLEAR; - break; - - case KeyboardKey.DeadCharProcessed: //This is usused. It's just here for completeness. - virtualKey = 0; //There is no Win32 VKey for this. - break; - - default: - virtualKey = 0; - break; - } - - return virtualKey; - } - - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - private static extern short GetKeyState(int keyCode); - private static KeyStates GetKeyState(KeyboardKey key) { KeyStates state = KeyStates.None; @@ -1388,11 +169,472 @@ public static class InputUtilities return state; } - [Flags] - private enum KeyStates + /// + /// Convert a Win32 VirtualKey into our Key enum. + /// + public static KeyboardKey KeyFromVirtualKey(int virtualKey) { - None = 0, - Down = 1, - Toggled = 2 + return virtualKey switch + { + NativeMethods.VK_CANCEL => KeyboardKey.Cancel, + NativeMethods.VK_BACK => KeyboardKey.Back, + NativeMethods.VK_TAB => KeyboardKey.Tab, + NativeMethods.VK_CLEAR => KeyboardKey.Clear, + NativeMethods.VK_RETURN => KeyboardKey.Return, + NativeMethods.VK_PAUSE => KeyboardKey.Pause, + NativeMethods.VK_CAPSLOCK => KeyboardKey.CapsLock, + NativeMethods.VK_JUNJA => KeyboardKey.JunjaMode, + NativeMethods.VK_FINAL => KeyboardKey.FinalMode, + NativeMethods.VK_ESCAPE => KeyboardKey.Escape, + NativeMethods.VK_CONVERT => KeyboardKey.ImeConvert, + NativeMethods.VK_NONCONVERT => KeyboardKey.ImeNonConvert, + NativeMethods.VK_ACCEPT => KeyboardKey.ImeAccept, + NativeMethods.VK_MODECHANGE => KeyboardKey.ImeModeChange, + NativeMethods.VK_SPACE => KeyboardKey.Space, + NativeMethods.VK_PRIOR => KeyboardKey.PageUp, + NativeMethods.VK_NEXT => KeyboardKey.PageDown, + NativeMethods.VK_END => KeyboardKey.End, + NativeMethods.VK_HOME => KeyboardKey.Home, + NativeMethods.VK_LEFT => KeyboardKey.Left, + NativeMethods.VK_UP => KeyboardKey.Up, + NativeMethods.VK_RIGHT => KeyboardKey.Right, + NativeMethods.VK_DOWN => KeyboardKey.Down, + NativeMethods.VK_SELECT => KeyboardKey.Select, + NativeMethods.VK_PRINT => KeyboardKey.Print, + NativeMethods.VK_EXECUTE => KeyboardKey.Execute, + NativeMethods.VK_INSERT => KeyboardKey.Insert, + NativeMethods.VK_DELETE => KeyboardKey.Delete, + NativeMethods.VK_HELP => KeyboardKey.Help, + NativeMethods.VK_0 => KeyboardKey.D0, + NativeMethods.VK_1 => KeyboardKey.D1, + NativeMethods.VK_2 => KeyboardKey.D2, + NativeMethods.VK_3 => KeyboardKey.D3, + NativeMethods.VK_4 => KeyboardKey.D4, + NativeMethods.VK_5 => KeyboardKey.D5, + NativeMethods.VK_6 => KeyboardKey.D6, + NativeMethods.VK_7 => KeyboardKey.D7, + NativeMethods.VK_8 => KeyboardKey.D8, + NativeMethods.VK_9 => KeyboardKey.D9, + NativeMethods.VK_A => KeyboardKey.A, + NativeMethods.VK_B => KeyboardKey.B, + NativeMethods.VK_C => KeyboardKey.C, + NativeMethods.VK_D => KeyboardKey.D, + NativeMethods.VK_E => KeyboardKey.E, + NativeMethods.VK_F => KeyboardKey.F, + NativeMethods.VK_G => KeyboardKey.G, + NativeMethods.VK_H => KeyboardKey.H, + NativeMethods.VK_I => KeyboardKey.I, + NativeMethods.VK_J => KeyboardKey.J, + NativeMethods.VK_K => KeyboardKey.K, + NativeMethods.VK_L => KeyboardKey.L, + NativeMethods.VK_M => KeyboardKey.M, + NativeMethods.VK_N => KeyboardKey.N, + NativeMethods.VK_O => KeyboardKey.O, + NativeMethods.VK_P => KeyboardKey.P, + NativeMethods.VK_Q => KeyboardKey.Q, + NativeMethods.VK_R => KeyboardKey.R, + NativeMethods.VK_S => KeyboardKey.S, + NativeMethods.VK_T => KeyboardKey.T, + NativeMethods.VK_U => KeyboardKey.U, + NativeMethods.VK_V => KeyboardKey.V, + NativeMethods.VK_W => KeyboardKey.W, + NativeMethods.VK_X => KeyboardKey.X, + NativeMethods.VK_Y => KeyboardKey.Y, + NativeMethods.VK_Z => KeyboardKey.Z, + NativeMethods.VK_LWIN => KeyboardKey.LWin, + NativeMethods.VK_RWIN => KeyboardKey.RWin, + NativeMethods.VK_APPS => KeyboardKey.Apps, + NativeMethods.VK_SLEEP => KeyboardKey.Sleep, + NativeMethods.VK_NUMPAD0 => KeyboardKey.NumPad0, + NativeMethods.VK_NUMPAD1 => KeyboardKey.NumPad1, + NativeMethods.VK_NUMPAD2 => KeyboardKey.NumPad2, + NativeMethods.VK_NUMPAD3 => KeyboardKey.NumPad3, + NativeMethods.VK_NUMPAD4 => KeyboardKey.NumPad4, + NativeMethods.VK_NUMPAD5 => KeyboardKey.NumPad5, + NativeMethods.VK_NUMPAD6 => KeyboardKey.NumPad6, + NativeMethods.VK_NUMPAD7 => KeyboardKey.NumPad7, + NativeMethods.VK_NUMPAD8 => KeyboardKey.NumPad8, + NativeMethods.VK_NUMPAD9 => KeyboardKey.NumPad9, + NativeMethods.VK_MULTIPLY => KeyboardKey.Multiply, + NativeMethods.VK_ADD => KeyboardKey.Add, + NativeMethods.VK_SEPARATOR => KeyboardKey.Separator, + NativeMethods.VK_SUBTRACT => KeyboardKey.Subtract, + NativeMethods.VK_DECIMAL => KeyboardKey.Decimal, + NativeMethods.VK_DIVIDE => KeyboardKey.Divide, + NativeMethods.VK_F1 => KeyboardKey.F1, + NativeMethods.VK_F2 => KeyboardKey.F2, + NativeMethods.VK_F3 => KeyboardKey.F3, + NativeMethods.VK_F4 => KeyboardKey.F4, + NativeMethods.VK_F5 => KeyboardKey.F5, + NativeMethods.VK_F6 => KeyboardKey.F6, + NativeMethods.VK_F7 => KeyboardKey.F7, + NativeMethods.VK_F8 => KeyboardKey.F8, + NativeMethods.VK_F9 => KeyboardKey.F9, + NativeMethods.VK_F10 => KeyboardKey.F10, + NativeMethods.VK_F11 => KeyboardKey.F11, + NativeMethods.VK_F12 => KeyboardKey.F12, + NativeMethods.VK_F13 => KeyboardKey.F13, + NativeMethods.VK_F14 => KeyboardKey.F14, + NativeMethods.VK_F15 => KeyboardKey.F15, + NativeMethods.VK_F16 => KeyboardKey.F16, + NativeMethods.VK_F17 => KeyboardKey.F17, + NativeMethods.VK_F18 => KeyboardKey.F18, + NativeMethods.VK_F19 => KeyboardKey.F19, + NativeMethods.VK_F20 => KeyboardKey.F20, + NativeMethods.VK_F21 => KeyboardKey.F21, + NativeMethods.VK_F22 => KeyboardKey.F22, + NativeMethods.VK_F23 => KeyboardKey.F23, + NativeMethods.VK_F24 => KeyboardKey.F24, + NativeMethods.VK_NUMLOCK => KeyboardKey.NumLock, + NativeMethods.VK_SCROLL => KeyboardKey.Scroll, + NativeMethods.VK_SHIFT => KeyboardKey.LeftShift, + NativeMethods.VK_LSHIFT => KeyboardKey.LeftShift, + NativeMethods.VK_RSHIFT => KeyboardKey.RightShift, + NativeMethods.VK_CONTROL => KeyboardKey.LeftCtrl, + NativeMethods.VK_LCONTROL => KeyboardKey.LeftCtrl, + NativeMethods.VK_RCONTROL => KeyboardKey.RightCtrl, + NativeMethods.VK_MENU => KeyboardKey.LeftAlt, + NativeMethods.VK_LMENU => KeyboardKey.LeftAlt, + NativeMethods.VK_RMENU => KeyboardKey.RightAlt, + NativeMethods.VK_BROWSER_BACK => KeyboardKey.BrowserBack, + NativeMethods.VK_BROWSER_FORWARD => KeyboardKey.BrowserForward, + NativeMethods.VK_BROWSER_REFRESH => KeyboardKey.BrowserRefresh, + NativeMethods.VK_BROWSER_STOP => KeyboardKey.BrowserStop, + NativeMethods.VK_BROWSER_SEARCH => KeyboardKey.BrowserSearch, + NativeMethods.VK_BROWSER_FAVORITES => KeyboardKey.BrowserFavorites, + NativeMethods.VK_BROWSER_HOME => KeyboardKey.BrowserHome, + NativeMethods.VK_VOLUME_MUTE => KeyboardKey.VolumeMute, + NativeMethods.VK_VOLUME_DOWN => KeyboardKey.VolumeDown, + NativeMethods.VK_VOLUME_UP => KeyboardKey.VolumeUp, + NativeMethods.VK_MEDIA_NEXT_TRACK => KeyboardKey.MediaNextTrack, + NativeMethods.VK_MEDIA_PREV_TRACK => KeyboardKey.MediaPreviousTrack, + NativeMethods.VK_MEDIA_STOP => KeyboardKey.MediaStop, + NativeMethods.VK_MEDIA_PLAY_PAUSE => KeyboardKey.MediaPlayPause, + NativeMethods.VK_LAUNCH_MAIL => KeyboardKey.LaunchMail, + NativeMethods.VK_LAUNCH_MEDIA_SELECT => KeyboardKey.SelectMedia, + NativeMethods.VK_LAUNCH_APP1 => KeyboardKey.LaunchApplication1, + NativeMethods.VK_LAUNCH_APP2 => KeyboardKey.LaunchApplication2, + NativeMethods.VK_OEM_1 => KeyboardKey.OemSemicolon, + NativeMethods.VK_OEM_PLUS => KeyboardKey.OemPlus, + NativeMethods.VK_OEM_COMMA => KeyboardKey.OemComma, + NativeMethods.VK_OEM_MINUS => KeyboardKey.OemMinus, + NativeMethods.VK_OEM_PERIOD => KeyboardKey.OemPeriod, + NativeMethods.VK_OEM_2 => KeyboardKey.OemQuestion, + NativeMethods.VK_OEM_3 => KeyboardKey.OemTilde, + NativeMethods.VK_OEM_4 => KeyboardKey.OemOpenBrackets, + NativeMethods.VK_OEM_5 => KeyboardKey.OemPipe, + NativeMethods.VK_OEM_6 => KeyboardKey.OemCloseBrackets, + NativeMethods.VK_OEM_7 => KeyboardKey.OemQuotes, + NativeMethods.VK_OEM_102 => KeyboardKey.OemBackslash, + NativeMethods.VK_PROCESSKEY => KeyboardKey.ImeProcessed, + NativeMethods.VK_OEM_ATTN => KeyboardKey.Attn, + NativeMethods.VK_OEM_FINISH => KeyboardKey.OemFinish, + NativeMethods.VK_OEM_COPY => KeyboardKey.OemCopy, + NativeMethods.VK_OEM_AUTO => KeyboardKey.OemAuto, + NativeMethods.VK_OEM_ENLW => KeyboardKey.OemEnlw, + NativeMethods.VK_OEM_BACKTAB => KeyboardKey.OemBackTab, + NativeMethods.VK_ATTN => KeyboardKey.Attn, + NativeMethods.VK_CRSEL => KeyboardKey.CrSel, + NativeMethods.VK_EXSEL => KeyboardKey.ExSel, + NativeMethods.VK_EREOF => KeyboardKey.EraseEof, + NativeMethods.VK_PLAY => KeyboardKey.Play, + NativeMethods.VK_ZOOM => KeyboardKey.Zoom, + NativeMethods.VK_NONAME => KeyboardKey.NoName, + NativeMethods.VK_PA1 => KeyboardKey.Pa1, + NativeMethods.VK_OEM_CLEAR => KeyboardKey.OemClear, + _ => KeyboardKey.None + }; + } + + /// + /// Convert our Key enum into a Win32 VirtualKeyboardKey. + /// + public static int VirtualKeyFromKey(KeyboardKey key) + { + return key switch + { + KeyboardKey.Cancel => NativeMethods.VK_CANCEL, + KeyboardKey.Back => NativeMethods.VK_BACK, + KeyboardKey.Tab => NativeMethods.VK_TAB, + KeyboardKey.Clear => NativeMethods.VK_CLEAR, + KeyboardKey.Return => NativeMethods.VK_RETURN, + KeyboardKey.Pause => NativeMethods.VK_PAUSE, + KeyboardKey.CapsLock => NativeMethods.VK_CAPITAL, + KeyboardKey.JunjaMode => NativeMethods.VK_JUNJA, + KeyboardKey.FinalMode => NativeMethods.VK_FINAL, + KeyboardKey.Escape => NativeMethods.VK_ESCAPE, + KeyboardKey.ImeConvert => NativeMethods.VK_CONVERT, + KeyboardKey.ImeNonConvert => NativeMethods.VK_NONCONVERT, + KeyboardKey.ImeAccept => NativeMethods.VK_ACCEPT, + KeyboardKey.ImeModeChange => NativeMethods.VK_MODECHANGE, + KeyboardKey.Space => NativeMethods.VK_SPACE, + KeyboardKey.Prior => NativeMethods.VK_PRIOR, + KeyboardKey.Next => NativeMethods.VK_NEXT, + KeyboardKey.End => NativeMethods.VK_END, + KeyboardKey.Home => NativeMethods.VK_HOME, + KeyboardKey.Left => NativeMethods.VK_LEFT, + KeyboardKey.Up => NativeMethods.VK_UP, + KeyboardKey.Right => NativeMethods.VK_RIGHT, + KeyboardKey.Down => NativeMethods.VK_DOWN, + KeyboardKey.Select => NativeMethods.VK_SELECT, + KeyboardKey.Print => NativeMethods.VK_PRINT, + KeyboardKey.Execute => NativeMethods.VK_EXECUTE, + KeyboardKey.Insert => NativeMethods.VK_INSERT, + KeyboardKey.Delete => NativeMethods.VK_DELETE, + KeyboardKey.Help => NativeMethods.VK_HELP, + KeyboardKey.D0 => NativeMethods.VK_0, + KeyboardKey.D1 => NativeMethods.VK_1, + KeyboardKey.D2 => NativeMethods.VK_2, + KeyboardKey.D3 => NativeMethods.VK_3, + KeyboardKey.D4 => NativeMethods.VK_4, + KeyboardKey.D5 => NativeMethods.VK_5, + KeyboardKey.D6 => NativeMethods.VK_6, + KeyboardKey.D7 => NativeMethods.VK_7, + KeyboardKey.D8 => NativeMethods.VK_8, + KeyboardKey.D9 => NativeMethods.VK_9, + KeyboardKey.A => NativeMethods.VK_A, + KeyboardKey.B => NativeMethods.VK_B, + KeyboardKey.C => NativeMethods.VK_C, + KeyboardKey.D => NativeMethods.VK_D, + KeyboardKey.E => NativeMethods.VK_E, + KeyboardKey.F => NativeMethods.VK_F, + KeyboardKey.G => NativeMethods.VK_G, + KeyboardKey.H => NativeMethods.VK_H, + KeyboardKey.I => NativeMethods.VK_I, + KeyboardKey.J => NativeMethods.VK_J, + KeyboardKey.K => NativeMethods.VK_K, + KeyboardKey.L => NativeMethods.VK_L, + KeyboardKey.M => NativeMethods.VK_M, + KeyboardKey.N => NativeMethods.VK_N, + KeyboardKey.O => NativeMethods.VK_O, + KeyboardKey.P => NativeMethods.VK_P, + KeyboardKey.Q => NativeMethods.VK_Q, + KeyboardKey.R => NativeMethods.VK_R, + KeyboardKey.S => NativeMethods.VK_S, + KeyboardKey.T => NativeMethods.VK_T, + KeyboardKey.U => NativeMethods.VK_U, + KeyboardKey.V => NativeMethods.VK_V, + KeyboardKey.W => NativeMethods.VK_W, + KeyboardKey.X => NativeMethods.VK_X, + KeyboardKey.Y => NativeMethods.VK_Y, + KeyboardKey.Z => NativeMethods.VK_Z, + KeyboardKey.LWin => NativeMethods.VK_LWIN, + KeyboardKey.RWin => NativeMethods.VK_RWIN, + KeyboardKey.Apps => NativeMethods.VK_APPS, + KeyboardKey.Sleep => NativeMethods.VK_SLEEP, + KeyboardKey.NumPad0 => NativeMethods.VK_NUMPAD0, + KeyboardKey.NumPad1 => NativeMethods.VK_NUMPAD1, + KeyboardKey.NumPad2 => NativeMethods.VK_NUMPAD2, + KeyboardKey.NumPad3 => NativeMethods.VK_NUMPAD3, + KeyboardKey.NumPad4 => NativeMethods.VK_NUMPAD4, + KeyboardKey.NumPad5 => NativeMethods.VK_NUMPAD5, + KeyboardKey.NumPad6 => NativeMethods.VK_NUMPAD6, + KeyboardKey.NumPad7 => NativeMethods.VK_NUMPAD7, + KeyboardKey.NumPad8 => NativeMethods.VK_NUMPAD8, + KeyboardKey.NumPad9 => NativeMethods.VK_NUMPAD9, + KeyboardKey.Multiply => NativeMethods.VK_MULTIPLY, + KeyboardKey.Add => NativeMethods.VK_ADD, + KeyboardKey.Separator => NativeMethods.VK_SEPARATOR, + KeyboardKey.Subtract => NativeMethods.VK_SUBTRACT, + KeyboardKey.Decimal => NativeMethods.VK_DECIMAL, + KeyboardKey.Divide => NativeMethods.VK_DIVIDE, + KeyboardKey.F1 => NativeMethods.VK_F1, + KeyboardKey.F2 => NativeMethods.VK_F2, + KeyboardKey.F3 => NativeMethods.VK_F3, + KeyboardKey.F4 => NativeMethods.VK_F4, + KeyboardKey.F5 => NativeMethods.VK_F5, + KeyboardKey.F6 => NativeMethods.VK_F6, + KeyboardKey.F7 => NativeMethods.VK_F7, + KeyboardKey.F8 => NativeMethods.VK_F8, + KeyboardKey.F9 => NativeMethods.VK_F9, + KeyboardKey.F10 => NativeMethods.VK_F10, + KeyboardKey.F11 => NativeMethods.VK_F11, + KeyboardKey.F12 => NativeMethods.VK_F12, + KeyboardKey.F13 => NativeMethods.VK_F13, + KeyboardKey.F14 => NativeMethods.VK_F14, + KeyboardKey.F15 => NativeMethods.VK_F15, + KeyboardKey.F16 => NativeMethods.VK_F16, + KeyboardKey.F17 => NativeMethods.VK_F17, + KeyboardKey.F18 => NativeMethods.VK_F18, + KeyboardKey.F19 => NativeMethods.VK_F19, + KeyboardKey.F20 => NativeMethods.VK_F20, + KeyboardKey.F21 => NativeMethods.VK_F21, + KeyboardKey.F22 => NativeMethods.VK_F22, + KeyboardKey.F23 => NativeMethods.VK_F23, + KeyboardKey.F24 => NativeMethods.VK_F24, + KeyboardKey.NumLock => NativeMethods.VK_NUMLOCK, + KeyboardKey.Scroll => NativeMethods.VK_SCROLL, + KeyboardKey.LeftShift => NativeMethods.VK_LSHIFT, + KeyboardKey.RightShift => NativeMethods.VK_RSHIFT, + KeyboardKey.LeftCtrl => NativeMethods.VK_LCONTROL, + KeyboardKey.RightCtrl => NativeMethods.VK_RCONTROL, + KeyboardKey.LeftAlt => NativeMethods.VK_LMENU, + KeyboardKey.RightAlt => NativeMethods.VK_RMENU, + KeyboardKey.BrowserBack => NativeMethods.VK_BROWSER_BACK, + KeyboardKey.BrowserForward => NativeMethods.VK_BROWSER_FORWARD, + KeyboardKey.BrowserRefresh => NativeMethods.VK_BROWSER_REFRESH, + KeyboardKey.BrowserStop => NativeMethods.VK_BROWSER_STOP, + KeyboardKey.BrowserSearch => NativeMethods.VK_BROWSER_SEARCH, + KeyboardKey.BrowserFavorites => NativeMethods.VK_BROWSER_FAVORITES, + KeyboardKey.BrowserHome => NativeMethods.VK_BROWSER_HOME, + KeyboardKey.VolumeMute => NativeMethods.VK_VOLUME_MUTE, + KeyboardKey.VolumeDown => NativeMethods.VK_VOLUME_DOWN, + KeyboardKey.VolumeUp => NativeMethods.VK_VOLUME_UP, + KeyboardKey.MediaNextTrack => NativeMethods.VK_MEDIA_NEXT_TRACK, + KeyboardKey.MediaPreviousTrack => NativeMethods.VK_MEDIA_PREV_TRACK, + KeyboardKey.MediaStop => NativeMethods.VK_MEDIA_STOP, + KeyboardKey.MediaPlayPause => NativeMethods.VK_MEDIA_PLAY_PAUSE, + KeyboardKey.LaunchMail => NativeMethods.VK_LAUNCH_MAIL, + KeyboardKey.SelectMedia => NativeMethods.VK_LAUNCH_MEDIA_SELECT, + KeyboardKey.LaunchApplication1 => NativeMethods.VK_LAUNCH_APP1, + KeyboardKey.LaunchApplication2 => NativeMethods.VK_LAUNCH_APP2, + KeyboardKey.OemSemicolon => NativeMethods.VK_OEM_1, + KeyboardKey.OemPlus => NativeMethods.VK_OEM_PLUS, + KeyboardKey.OemComma => NativeMethods.VK_OEM_COMMA, + KeyboardKey.OemMinus => NativeMethods.VK_OEM_MINUS, + KeyboardKey.OemPeriod => NativeMethods.VK_OEM_PERIOD, + KeyboardKey.OemQuestion => NativeMethods.VK_OEM_2, + KeyboardKey.OemTilde => NativeMethods.VK_OEM_3, + KeyboardKey.OemOpenBrackets => NativeMethods.VK_OEM_4, + KeyboardKey.OemPipe => NativeMethods.VK_OEM_5, + KeyboardKey.OemCloseBrackets => NativeMethods.VK_OEM_6, + KeyboardKey.OemQuotes => NativeMethods.VK_OEM_7, + KeyboardKey.OemBackslash => NativeMethods.VK_OEM_102, + KeyboardKey.ImeProcessed => NativeMethods.VK_PROCESSKEY, + KeyboardKey.OemAttn => NativeMethods.VK_ATTN, + KeyboardKey.OemFinish => NativeMethods.VK_OEM_FINISH, + KeyboardKey.OemCopy => NativeMethods.VK_OEM_COPY, + KeyboardKey.OemAuto => NativeMethods.VK_OEM_AUTO, + KeyboardKey.OemEnlw => NativeMethods.VK_OEM_ENLW, + KeyboardKey.OemBackTab => NativeMethods.VK_OEM_BACKTAB, + KeyboardKey.Attn => NativeMethods.VK_ATTN, + KeyboardKey.CrSel => NativeMethods.VK_CRSEL, + KeyboardKey.ExSel => NativeMethods.VK_EXSEL, + KeyboardKey.EraseEof => NativeMethods.VK_EREOF, + KeyboardKey.Play => NativeMethods.VK_PLAY, + KeyboardKey.Zoom => NativeMethods.VK_ZOOM, + KeyboardKey.NoName => NativeMethods.VK_NONAME, + KeyboardKey.Pa1 => NativeMethods.VK_PA1, + KeyboardKey.OemClear => NativeMethods.VK_OEM_CLEAR, + KeyboardKey.DeadCharProcessed => 0, + _ => 0 + }; + } + + /// + /// Convert a scan code to a key, following US keyboard layout. + /// This is useful because we don't care about the keyboard layout, just the key location for effects. + /// + public static KeyboardKey KeyFromScanCode(uint scanCode) + { + return scanCode switch + { + 0x01 => KeyboardKey.Escape, + 0x02 => KeyboardKey.D1, + 0x03 => KeyboardKey.D2, + 0x04 => KeyboardKey.D3, + 0x05 => KeyboardKey.D4, + 0x06 => KeyboardKey.D5, + 0x07 => KeyboardKey.D6, + 0x08 => KeyboardKey.D7, + 0x09 => KeyboardKey.D8, + 0x0A => KeyboardKey.D9, + 0x0B => KeyboardKey.D0, + 0x0C => KeyboardKey.OemMinus, + 0x0D => KeyboardKey.OemPlus, + 0x0E => KeyboardKey.Back, + 0x0F => KeyboardKey.Tab, + 0x10 => KeyboardKey.Q, + 0x11 => KeyboardKey.W, + 0x12 => KeyboardKey.E, + 0x13 => KeyboardKey.R, + 0x14 => KeyboardKey.T, + 0x15 => KeyboardKey.Y, + 0x16 => KeyboardKey.U, + 0x17 => KeyboardKey.I, + 0x18 => KeyboardKey.O, + 0x19 => KeyboardKey.P, + 0x1A => KeyboardKey.OemOpenBrackets, + 0x1B => KeyboardKey.OemCloseBrackets, + 0x1C => KeyboardKey.Enter, + 0x1D => KeyboardKey.LeftCtrl, + 0x1E => KeyboardKey.A, + 0x1F => KeyboardKey.S, + 0x20 => KeyboardKey.D, + 0x21 => KeyboardKey.F, + 0x22 => KeyboardKey.G, + 0x23 => KeyboardKey.H, + 0x24 => KeyboardKey.J, + 0x25 => KeyboardKey.K, + 0x26 => KeyboardKey.L, + 0x27 => KeyboardKey.OemSemicolon, + 0x28 => KeyboardKey.OemQuotes, + 0x29 => KeyboardKey.OemTilde, + 0x2A => KeyboardKey.LeftShift, + 0x2B => KeyboardKey.OemPipe, + 0x2C => KeyboardKey.Z, + 0x2D => KeyboardKey.X, + 0x2E => KeyboardKey.C, + 0x2F => KeyboardKey.V, + 0x30 => KeyboardKey.B, + 0x31 => KeyboardKey.N, + 0x32 => KeyboardKey.M, + 0x33 => KeyboardKey.OemComma, + 0x34 => KeyboardKey.OemPeriod, + 0x35 => KeyboardKey.OemQuestion, + 0x36 => KeyboardKey.RightShift, + 0x37 => KeyboardKey.PrintScreen, + 0x38 => KeyboardKey.LeftAlt, + 0x39 => KeyboardKey.Space, + 0x3A => KeyboardKey.CapsLock, + 0x3B => KeyboardKey.F1, + 0x3C => KeyboardKey.F2, + 0x3D => KeyboardKey.F3, + 0x3E => KeyboardKey.F4, + 0x3F => KeyboardKey.F5, + 0x40 => KeyboardKey.F6, + 0x41 => KeyboardKey.F7, + 0x42 => KeyboardKey.F8, + 0x43 => KeyboardKey.F9, + 0x44 => KeyboardKey.F10, + 0x45 => KeyboardKey.Pause, + 0x46 => KeyboardKey.Scroll, + 0x47 => KeyboardKey.NumPad7, + 0x48 => KeyboardKey.NumPad8, + 0x49 => KeyboardKey.NumPad9, + 0x4A => KeyboardKey.Subtract, + 0x4B => KeyboardKey.NumPad4, + 0x4C => KeyboardKey.NumPad5, + 0x4D => KeyboardKey.NumPad6, + 0x4E => KeyboardKey.Add, + 0x4F => KeyboardKey.NumPad1, + 0x50 => KeyboardKey.NumPad2, + 0x51 => KeyboardKey.NumPad3, + 0x52 => KeyboardKey.NumPad0, + 0x53 => KeyboardKey.Decimal, + 0x56 => KeyboardKey.OemBackslash, + 0x57 => KeyboardKey.F11, + 0x58 => KeyboardKey.F12, + 0x5C => KeyboardKey.RWin, + 0x64 => KeyboardKey.F13, + 0x65 => KeyboardKey.F14, + 0x66 => KeyboardKey.F15, + //0x70 => KeyboardKey.kana, + 0x73 => KeyboardKey.AbntC1, + //0x79 => KeyboardKey.Convert, + //0x7B => KeyboardKey.NoConvert, + //0x7D => KeyboardKey.Yen, + 0x7E => KeyboardKey.AbntC2, + // 0x8D => KeyboardKey.NumPadEquals, + // 0x90 => KeyboardKey.PreviousTrack, + // 0x91 => KeyboardKey.At, + // 0x92 => KeyboardKey.Colon, + // 0x93 => KeyboardKey.Underline, + // 0x94 => KeyboardKey.Kanji, + // 0x95 => KeyboardKey.Stop, + // 0x96 => KeyboardKey.Ax, + 0x145 => KeyboardKey.NumLock, + _ => KeyboardKey.None + }; } } \ No newline at end of file From 02ecbfa7081f1047cd2f3c82c47be942d3681138 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Thu, 6 Apr 2023 15:32:02 +0100 Subject: [PATCH 2/3] Simplified scan code input parsing --- .../Providers/Input/WindowsInputProvider.cs | 30 +- .../Utilities/InputUtilities.cs | 309 ++++++++---------- 2 files changed, 147 insertions(+), 192 deletions(-) diff --git a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs index c50a626df..1adc2b292 100644 --- a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs +++ b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs @@ -98,17 +98,21 @@ public class WindowsInputProvider : InputProvider private void HandleKeyboardData(RawInputData data, RawInputKeyboardData keyboardData) { - KeyboardKey key = InputUtilities.CorrectVirtualKeyAndScanCode((uint)keyboardData.Keyboard.VirutalKey, (uint)keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags); + KeyboardKey key = KeyboardKey.None; + try + { + key = InputUtilities.CorrectVirtualKeyAndScanCode(keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags); + } + catch (Exception e) + { + _logger.Error("Failed to convert virtual key to Artemis key, please share this log with the developers. ScanCode: {scanCode} VK: {virtualKey} Flags: {flags}", + keyboardData.Keyboard.ScanCode, keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.Flags); + } // Debug.WriteLine($"VK: {key} ({keyboardData.Keyboard.VirutalKey}), Flags: {keyboardData.Keyboard.Flags}, Scan code: {keyboardData.Keyboard.ScanCode}"); - // Sometimes we get double hits and they resolve to None, ignore those if (key == KeyboardKey.None) return; - // Right alt triggers LeftCtrl with a different scan code for some reason, ignore those - if (key == KeyboardKey.LeftCtrl && keyboardData.Keyboard.ScanCode == 56) - return; - string? identifier = data.Device?.DevicePath; // Let the core know there is an identifier so it can store new identifications if applicable @@ -126,20 +130,6 @@ public class WindowsInputProvider : InputProvider _logger.Warning(e, "Failed to retrieve input device by its identifier"); } - // Duplicate keys with different positions can be identified by the LeftKey flag (even though its set of the key that's physically on the right) - if (keyboardData.Keyboard.Flags == RawKeyboardFlags.KeyE0 || keyboardData.Keyboard.Flags == (RawKeyboardFlags.KeyE0 | RawKeyboardFlags.Up)) - { - if (key == KeyboardKey.Enter) - key = KeyboardKey.NumPadEnter; - if (key == KeyboardKey.LeftCtrl) - key = KeyboardKey.RightCtrl; - if (key == KeyboardKey.LeftAlt) - key = KeyboardKey.RightAlt; - } - - if (key == KeyboardKey.LeftShift && keyboardData.Keyboard.ScanCode == 54) - key = KeyboardKey.RightShift; - bool isDown = keyboardData.Keyboard.Flags != RawKeyboardFlags.Up && keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE0) && keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE1); diff --git a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs index 3a06fccf4..d6b5a2fc6 100644 --- a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs @@ -67,79 +67,63 @@ public static class InputUtilities MAPVK_VK_TO_VSC_EX = 0x04 } + private readonly record struct KeystrokeInfo(int ScanCode, int VirtualKey, bool IsE0, bool IsE1); + /// /// https://blog.molecular-matters.com/2011/09/05/properly-handling-keyboard-input/ /// - public static KeyboardKey CorrectVirtualKeyAndScanCode(uint virtualKey, uint scanCode, uint flags) + public static KeyboardKey CorrectVirtualKeyAndScanCode(int virtualKey, int scanCode, uint flags) { - if (virtualKey == 255) + KeystrokeInfo info = new() { - // discard "fake keys" which are part of an escaped sequence - return KeyboardKey.None; - } - - if (virtualKey == NativeMethods.VK_CONTROL && scanCode == 0x38) - { - //fake altgr ctrl - return KeyboardKey.None; - } - - if (virtualKey == NativeMethods.VK_SHIFT) - { - // correct left-hand / right-hand SHIFT - virtualKey = MapVirtualKey(scanCode, MapVirtualKeyMapTypes.MAPVK_VSC_TO_VK); - } - else if (virtualKey == NativeMethods.VK_NUMLOCK) - { - // correct PAUSE/BREAK and NUM LOCK silliness, and set the extended bit - scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC) | 0x100; - } - - const byte RI_KEY_E0 = 0x02; - const byte RI_KEY_E1 = 0x04; - bool isE0 = (flags & RI_KEY_E0) != 0; - bool isE1 = (flags & RI_KEY_E1) != 0; - - if (isE1) - { - if (virtualKey == NativeMethods.VK_PAUSE) - { - scanCode = 0x45; - } - else - { - scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC); - } - } - KeyboardKey key = (short)virtualKey switch - { - NativeMethods.VK_CONTROL => isE0 ? KeyboardKey.RightCtrl : KeyboardKey.LeftCtrl, - NativeMethods.VK_MENU => isE0 ? KeyboardKey.RightAlt : KeyboardKey.LeftAlt, - NativeMethods.VK_RETURN => isE0 ? KeyboardKey.NumPadEnter : KeyboardKey.Enter, - NativeMethods.VK_INSERT => !isE0 ? KeyboardKey.NumPad0 : KeyboardKey.Insert, - NativeMethods.VK_DELETE => !isE0 ? KeyboardKey.NumPadDecimal : KeyboardKey.Delete, - NativeMethods.VK_HOME => !isE0 ? KeyboardKey.NumPad7 : KeyboardKey.Home, - NativeMethods.VK_END => !isE0 ? KeyboardKey.NumPad1 : KeyboardKey.End, - NativeMethods.VK_PRIOR => !isE0 ? KeyboardKey.NumPad9 : KeyboardKey.PageUp, - NativeMethods.VK_NEXT => !isE0 ? KeyboardKey.NumPad3 : KeyboardKey.PageDown, - NativeMethods.VK_LEFT => !isE0 ? KeyboardKey.NumPad4 : KeyboardKey.Left, - NativeMethods.VK_RIGHT => !isE0 ? KeyboardKey.NumPad6 : KeyboardKey.Right, - NativeMethods.VK_UP => !isE0 ? KeyboardKey.NumPad8 : KeyboardKey.Up, - NativeMethods.VK_DOWN => !isE0 ? KeyboardKey.NumPad2 : KeyboardKey.Down, - NativeMethods.VK_CLEAR => !isE0 ? KeyboardKey.NumPad5 : KeyboardKey.Clear, - NativeMethods.VK_DIVIDE => isE0 ? KeyboardKey.NumPadDivide : KeyboardKey.Divide, - NativeMethods.VK_MULTIPLY => isE0 ? KeyboardKey.NumPadMultiply : KeyboardKey.Multiply, - _ => KeyboardKey.None + ScanCode = scanCode, + VirtualKey = virtualKey, + IsE0 = (flags & 2) != 0, + IsE1 = (flags & 4) != 0 }; - if (key != KeyboardKey.None) - return key; - - key = KeyFromScanCode(scanCode); - if (key != KeyboardKey.None) - return key; - - return KeyFromVirtualKey((int)virtualKey); + return info switch + { + // Fake keys, usually escape sequences + { VirtualKey: 255 } => KeyboardKey.None, + // AltGr + { ScanCode: 56, VirtualKey: NativeMethods.VK_CONTROL, IsE0: true } => KeyboardKey.None, + + { ScanCode: 28, IsE0: true } => KeyboardKey.NumPadEnter, + { ScanCode: 28, IsE0: false } => KeyboardKey.Return, + { ScanCode: 29, IsE1: true } => KeyboardKey.Pause, + { ScanCode: 29, IsE0: true } => KeyboardKey.RightCtrl, + { ScanCode: 29, IsE0: false } => KeyboardKey.LeftCtrl, + { ScanCode: 56, IsE0: true } => KeyboardKey.RightAlt, + { ScanCode: 56, IsE0: false } => KeyboardKey.LeftAlt, + { ScanCode: 53, IsE0: true } => KeyboardKey.NumPadDivide, + { ScanCode: 53, IsE0: false } => KeyboardKey.OemQuestion, + { ScanCode: 55, IsE0: true } => KeyboardKey.PrintScreen, + { ScanCode: 55, IsE0: false } => KeyboardKey.NumPadMultiply, + { ScanCode: 71, IsE0: true } => KeyboardKey.Home, + { ScanCode: 71, IsE0: false } => KeyboardKey.NumPad7, + { ScanCode: 72, IsE0: true } => KeyboardKey.Up, + { ScanCode: 72, IsE0: false } => KeyboardKey.NumPad8, + { ScanCode: 73, IsE0: true } => KeyboardKey.PageUp, + { ScanCode: 73, IsE0: false } => KeyboardKey.NumPad9, + { ScanCode: 75, IsE0: true } => KeyboardKey.Left, + { ScanCode: 75, IsE0: false } => KeyboardKey.NumPad4, + { ScanCode: 76, IsE0: true } => KeyboardKey.Clear, + { ScanCode: 76, IsE0: false } => KeyboardKey.NumPad5, + { ScanCode: 77, IsE0: true } => KeyboardKey.Right, + { ScanCode: 77, IsE0: false } => KeyboardKey.NumPad6, + { ScanCode: 79, IsE0: true } => KeyboardKey.End, + { ScanCode: 79, IsE0: false } => KeyboardKey.NumPad1, + { ScanCode: 80, IsE0: true } => KeyboardKey.Down, + { ScanCode: 80, IsE0: false } => KeyboardKey.NumPad2, + { ScanCode: 81, IsE0: true } => KeyboardKey.PageDown, + { ScanCode: 81, IsE0: false } => KeyboardKey.NumPad3, + { ScanCode: 82, IsE0: true } => KeyboardKey.Insert, + { ScanCode: 82, IsE0: false } => KeyboardKey.NumPad0, + { ScanCode: 83, IsE0: true } => KeyboardKey.Delete, + { ScanCode: 83, IsE0: false } => KeyboardKey.NumPadDecimal, + _ => KeyFromScanCode((uint)info.ScanCode), + }; } public static bool IsKeyDown(KeyboardKey key) { @@ -529,112 +513,93 @@ public static class InputUtilities { return scanCode switch { - 0x01 => KeyboardKey.Escape, - 0x02 => KeyboardKey.D1, - 0x03 => KeyboardKey.D2, - 0x04 => KeyboardKey.D3, - 0x05 => KeyboardKey.D4, - 0x06 => KeyboardKey.D5, - 0x07 => KeyboardKey.D6, - 0x08 => KeyboardKey.D7, - 0x09 => KeyboardKey.D8, - 0x0A => KeyboardKey.D9, - 0x0B => KeyboardKey.D0, - 0x0C => KeyboardKey.OemMinus, - 0x0D => KeyboardKey.OemPlus, - 0x0E => KeyboardKey.Back, - 0x0F => KeyboardKey.Tab, - 0x10 => KeyboardKey.Q, - 0x11 => KeyboardKey.W, - 0x12 => KeyboardKey.E, - 0x13 => KeyboardKey.R, - 0x14 => KeyboardKey.T, - 0x15 => KeyboardKey.Y, - 0x16 => KeyboardKey.U, - 0x17 => KeyboardKey.I, - 0x18 => KeyboardKey.O, - 0x19 => KeyboardKey.P, - 0x1A => KeyboardKey.OemOpenBrackets, - 0x1B => KeyboardKey.OemCloseBrackets, - 0x1C => KeyboardKey.Enter, - 0x1D => KeyboardKey.LeftCtrl, - 0x1E => KeyboardKey.A, - 0x1F => KeyboardKey.S, - 0x20 => KeyboardKey.D, - 0x21 => KeyboardKey.F, - 0x22 => KeyboardKey.G, - 0x23 => KeyboardKey.H, - 0x24 => KeyboardKey.J, - 0x25 => KeyboardKey.K, - 0x26 => KeyboardKey.L, - 0x27 => KeyboardKey.OemSemicolon, - 0x28 => KeyboardKey.OemQuotes, - 0x29 => KeyboardKey.OemTilde, - 0x2A => KeyboardKey.LeftShift, - 0x2B => KeyboardKey.OemPipe, - 0x2C => KeyboardKey.Z, - 0x2D => KeyboardKey.X, - 0x2E => KeyboardKey.C, - 0x2F => KeyboardKey.V, - 0x30 => KeyboardKey.B, - 0x31 => KeyboardKey.N, - 0x32 => KeyboardKey.M, - 0x33 => KeyboardKey.OemComma, - 0x34 => KeyboardKey.OemPeriod, - 0x35 => KeyboardKey.OemQuestion, - 0x36 => KeyboardKey.RightShift, - 0x37 => KeyboardKey.PrintScreen, - 0x38 => KeyboardKey.LeftAlt, - 0x39 => KeyboardKey.Space, - 0x3A => KeyboardKey.CapsLock, - 0x3B => KeyboardKey.F1, - 0x3C => KeyboardKey.F2, - 0x3D => KeyboardKey.F3, - 0x3E => KeyboardKey.F4, - 0x3F => KeyboardKey.F5, - 0x40 => KeyboardKey.F6, - 0x41 => KeyboardKey.F7, - 0x42 => KeyboardKey.F8, - 0x43 => KeyboardKey.F9, - 0x44 => KeyboardKey.F10, - 0x45 => KeyboardKey.Pause, - 0x46 => KeyboardKey.Scroll, - 0x47 => KeyboardKey.NumPad7, - 0x48 => KeyboardKey.NumPad8, - 0x49 => KeyboardKey.NumPad9, - 0x4A => KeyboardKey.Subtract, - 0x4B => KeyboardKey.NumPad4, - 0x4C => KeyboardKey.NumPad5, - 0x4D => KeyboardKey.NumPad6, - 0x4E => KeyboardKey.Add, - 0x4F => KeyboardKey.NumPad1, - 0x50 => KeyboardKey.NumPad2, - 0x51 => KeyboardKey.NumPad3, - 0x52 => KeyboardKey.NumPad0, - 0x53 => KeyboardKey.Decimal, - 0x56 => KeyboardKey.OemBackslash, - 0x57 => KeyboardKey.F11, - 0x58 => KeyboardKey.F12, - 0x5C => KeyboardKey.RWin, - 0x64 => KeyboardKey.F13, - 0x65 => KeyboardKey.F14, - 0x66 => KeyboardKey.F15, - //0x70 => KeyboardKey.kana, - 0x73 => KeyboardKey.AbntC1, - //0x79 => KeyboardKey.Convert, - //0x7B => KeyboardKey.NoConvert, - //0x7D => KeyboardKey.Yen, - 0x7E => KeyboardKey.AbntC2, - // 0x8D => KeyboardKey.NumPadEquals, - // 0x90 => KeyboardKey.PreviousTrack, - // 0x91 => KeyboardKey.At, - // 0x92 => KeyboardKey.Colon, - // 0x93 => KeyboardKey.Underline, - // 0x94 => KeyboardKey.Kanji, - // 0x95 => KeyboardKey.Stop, - // 0x96 => KeyboardKey.Ax, - 0x145 => KeyboardKey.NumLock, - _ => KeyboardKey.None + 1 => KeyboardKey.Escape, + 2 => KeyboardKey.D1, + 3 => KeyboardKey.D2, + 4 => KeyboardKey.D3, + 5 => KeyboardKey.D4, + 6 => KeyboardKey.D5, + 7 => KeyboardKey.D6, + 8 => KeyboardKey.D7, + 9 => KeyboardKey.D8, + 10 => KeyboardKey.D9, + 11 => KeyboardKey.D0, + 12 => KeyboardKey.OemMinus, + 13 => KeyboardKey.OemPlus, + 14 => KeyboardKey.Back, + 15 => KeyboardKey.Tab, + 16 => KeyboardKey.Q, + 17 => KeyboardKey.W, + 18 => KeyboardKey.E, + 19 => KeyboardKey.R, + 20 => KeyboardKey.T, + 21 => KeyboardKey.Y, + 22 => KeyboardKey.U, + 23 => KeyboardKey.I, + 24 => KeyboardKey.O, + 25 => KeyboardKey.P, + 26 => KeyboardKey.OemOpenBrackets, + 27 => KeyboardKey.OemCloseBrackets, + 30 => KeyboardKey.A, + 31 => KeyboardKey.S, + 32 => KeyboardKey.D, + 33 => KeyboardKey.F, + 34 => KeyboardKey.G, + 35 => KeyboardKey.H, + 36 => KeyboardKey.J, + 37 => KeyboardKey.K, + 38 => KeyboardKey.L, + 39 => KeyboardKey.OemSemicolon, + 40 => KeyboardKey.OemQuotes, + 41 => KeyboardKey.OemTilde, + 42 => KeyboardKey.LeftShift, + 43 => KeyboardKey.OemPipe, + 44 => KeyboardKey.Z, + 45 => KeyboardKey.X, + 46 => KeyboardKey.C, + 47 => KeyboardKey.V, + 48 => KeyboardKey.B, + 49 => KeyboardKey.N, + 50 => KeyboardKey.M, + 51 => KeyboardKey.OemComma, + 52 => KeyboardKey.OemPeriod, + 54 => KeyboardKey.RightShift, + 57 => KeyboardKey.Space, + 58 => KeyboardKey.CapsLock, + 59 => KeyboardKey.F1, + 60 => KeyboardKey.F2, + 61 => KeyboardKey.F3, + 62 => KeyboardKey.F4, + 63 => KeyboardKey.F5, + 64 => KeyboardKey.F6, + 65 => KeyboardKey.F7, + 66 => KeyboardKey.F8, + 67 => KeyboardKey.F9, + 68 => KeyboardKey.F10, + 69 => KeyboardKey.NumLock, + 70 => KeyboardKey.Scroll, + 74 => KeyboardKey.NumPadSubtract, + 78 => KeyboardKey.NumPadAdd, + 86 => KeyboardKey.OemBackslash, //On iso, it's the key between left shift and Z + 87 => KeyboardKey.F11, + 88 => KeyboardKey.F12, + 91 => KeyboardKey.LWin, + 92 => KeyboardKey.RWin, + + //28 = enter or numpad enter + //29 = left ctrl or right ctrl + //53 = numpad slash or slash + //55 = numpad asterisk or print screen + //56 = left alt or right alt + 28 or 29 or 53 or 55 or 56 => throw new ArgumentException($"This key is unsupported: {scanCode}", nameof(scanCode)), + //numpad 789 or home, up, page up + >= 71 and <= 73 => throw new ArgumentException("Scan code is for a numpad key. These keys are unsupported.", nameof(scanCode)), + //numpad 456 or left, clear, right + >= 75 and <= 77 => throw new ArgumentException("Scan code is for a numpad key. These keys are unsupported.", nameof(scanCode)), + //numpad 1230., or end, down, page down, ins, del + >= 79 and <= 83 => throw new ArgumentException("Scan code is for a numpad key. These keys are unsupported.", nameof(scanCode)), + //shouldn't happen, but there might be more weird keys in other layouts + _ => throw new ArgumentException($"This key is unsupported: {scanCode}", nameof(scanCode)), }; } } \ No newline at end of file From 5e34a8112bccb25c150680014f12a7e2b5d99e4c Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Thu, 6 Apr 2023 22:49:54 +0100 Subject: [PATCH 3/3] Input - Removed unused keyboard keys simplified a bunch of enum flag code changed dictionaries into switches --- .../Services/Input/Enums/KeyboardKey.cs | 659 +++++++----------- .../Services/Input/InputKeyLedIdMap.cs | 370 +++++----- .../Services/Input/InputService.cs | 6 +- .../Utilities/InputUtilities.cs | 29 +- .../Providers/Input/WindowsInputProvider.cs | 51 +- .../Utilities/InputUtilities.cs | 217 ++---- .../Device/Tabs/InputMappingsTabViewModel.cs | 2 +- 7 files changed, 540 insertions(+), 794 deletions(-) diff --git a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs index 39bfbcbd2..d58ae8f02 100644 --- a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs +++ b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs @@ -4,533 +4,218 @@ public enum KeyboardKey { /// No key pressed. - None = 0, - - /// The Cancel key. - Cancel = 1, - + None, + /// The Backspace key. - Back = 2, + Backspace, /// The Tab key. - Tab = 3, - - /// The Linefeed key. - LineFeed = 4, + Tab, /// The Clear key. - Clear = 5, + Clear, /// The Enter key. - Enter = 6, - - /// The Return key. - Return = 6, + Enter, /// The Pause key. - Pause = 7, + PauseBreak, /// The Caps Lock key. - CapsLock = 8, + CapsLock, + + /// The Escape key. + Escape, - /// The IME Hangul mode key. - HangulMode = 9, - - /// The IME Junja mode key. - JunjaMode = 10, // 0x0000000A - - /// The IME Final mode key. - FinalMode = 11, // 0x0000000B - - /// The IME Hanja mode key. - HanjaMode = 12, // 0x0000000C - - /// The ESC key. - Escape = 13, // 0x0000000D - - /// The IME Convert key. - ImeConvert = 14, // 0x0000000E - - /// The IME NonConvert key. - ImeNonConvert = 15, // 0x0000000F - - /// The IME Accept key. - ImeAccept = 16, // 0x00000010 - - /// The IME Mode change request. - ImeModeChange = 17, // 0x00000011 - - /// The Spacebar key. - Space = 18, // 0x00000012 + /// The Space bar key. + Space, /// The Page Up key. - PageUp = 19, // 0x00000013 - - /// The Page Up key. - Prior = 19, // 0x00000013 + PageUp, /// The Page Down key. - Next = 20, // 0x00000014 - - /// The Page Down key. - PageDown = 20, // 0x00000014 + PageDown, /// The End key. - End = 21, // 0x00000015 + End, /// The Home key. - Home = 22, // 0x00000016 + Home, /// The Left Arrow key. - Left = 23, // 0x00000017 + ArrowLeft, /// The Up Arrow key. - Up = 24, // 0x00000018 + ArrowUp, /// The Right Arrow key. - Right = 25, // 0x00000019 + ArrowRight, /// The Down Arrow key. - Down = 26, // 0x0000001A - - /// The Select key. - Select = 27, // 0x0000001B - - /// The Print key. - Print = 28, // 0x0000001C - - /// The Execute key. - Execute = 29, // 0x0000001D + ArrowDown, /// The Print Screen key. - PrintScreen = 30, // 0x0000001E + PrintScreen, /// The Insert key. - Insert = 31, // 0x0000001F + Insert, /// The Delete key. - Delete = 32, // 0x00000020 - - /// The Help key. - Help = 33, // 0x00000021 + Delete, /// The 0 (zero) key. - D0 = 34, // 0x00000022 + D0, /// The 1 (one) key. - D1 = 35, // 0x00000023 + D1, /// The 2 key. - D2 = 36, // 0x00000024 + D2, /// The 3 key. - D3 = 37, // 0x00000025 + D3, /// The 4 key. - D4 = 38, // 0x00000026 + D4, /// The 5 key. - D5 = 39, // 0x00000027 + D5, /// The 6 key. - D6 = 40, // 0x00000028 + D6, /// The 7 key. - D7 = 41, // 0x00000029 + D7, /// The 8 key. - D8 = 42, // 0x0000002A + D8, /// The 9 key. - D9 = 43, // 0x0000002B + D9, /// The A key. - A = 44, // 0x0000002C + A, /// The B key. - B = 45, // 0x0000002D + B, /// The C key. - C = 46, // 0x0000002E + C, /// The D key. - D = 47, // 0x0000002F + D, /// The E key. - E = 48, // 0x00000030 + E, /// The F key. - F = 49, // 0x00000031 + F, /// The G key. - G = 50, // 0x00000032 + G, /// The H key. - H = 51, // 0x00000033 + H, /// The I key. - I = 52, // 0x00000034 + I, /// The J key. - J = 53, // 0x00000035 + J, /// The K key. - K = 54, // 0x00000036 + K, /// The L key. - L = 55, // 0x00000037 + L, /// The M key. - M = 56, // 0x00000038 + M, /// The N key. - N = 57, // 0x00000039 + N, /// The O key. - O = 58, // 0x0000003A + O, /// The P key. - P = 59, // 0x0000003B + P, /// The Q key. - Q = 60, // 0x0000003C + Q, /// The R key. - R = 61, // 0x0000003D + R, /// The S key. - S = 62, // 0x0000003E + S, /// The T key. - T = 63, // 0x0000003F + T, /// The U key. - U = 64, // 0x00000040 + U, /// The V key. - V = 65, // 0x00000041 + V, /// The W key. - W = 66, // 0x00000042 + W, /// The X key. - X = 67, // 0x00000043 + X, /// The Y key. - Y = 68, // 0x00000044 + Y, /// The Z key. - Z = 69, // 0x00000045 + Z, /// The left Windows logo key (Microsoft Natural Keyboard). - LWin = 70, // 0x00000046 + LeftWin, /// The right Windows logo key (Microsoft Natural Keyboard). - RWin = 71, // 0x00000047 + RightWin, - /// - /// The Application key (Microsoft Natural Keyboard). Also known as the Menu key, as it displays an - /// application-specific context menu. - /// - Apps = 72, // 0x00000048 + /// The Application key. Displays an application-specific context menu. + Application, /// The Computer Sleep key. - Sleep = 73, // 0x00000049 + Sleep, + + /// The Num Lock key. + NumLock, /// The 0 key on the numeric keypad. - NumPad0 = 74, // 0x0000004A + NumPad0, /// The 1 key on the numeric keypad. - NumPad1 = 75, // 0x0000004B + NumPad1, /// The 2 key on the numeric keypad. - NumPad2 = 76, // 0x0000004C + NumPad2, /// The 3 key on the numeric keypad. - NumPad3 = 77, // 0x0000004D + NumPad3, /// The 4 key on the numeric keypad. - NumPad4 = 78, // 0x0000004E + NumPad4, /// The 5 key on the numeric keypad. - NumPad5 = 79, // 0x0000004F + NumPad5, /// The 6 key on the numeric keypad. - NumPad6 = 80, // 0x00000050 + NumPad6, /// The 7 key on the numeric keypad. - NumPad7 = 81, // 0x00000051 + NumPad7, /// The 8 key on the numeric keypad. - NumPad8 = 82, // 0x00000052 + NumPad8, /// The 9 key on the numeric keypad. - NumPad9 = 83, // 0x00000053 - - /// The Multiply key. - Multiply = 84, // 0x00000054 - - /// The Add key. - Add = 85, // 0x00000055 - - /// The Separator key. - Separator = 86, // 0x00000056 - - /// The Subtract key. - Subtract = 87, // 0x00000057 - - /// The Decimal key. - Decimal = 88, // 0x00000058 - - /// The Divide key. - Divide = 89, // 0x00000059 - - /// The F1 key. - F1 = 90, // 0x0000005A - - /// The F2 key. - F2 = 91, // 0x0000005B - - /// The F3 key. - F3 = 92, // 0x0000005C - - /// The F4 key. - F4 = 93, // 0x0000005D - - /// The F5 key. - F5 = 94, // 0x0000005E - - /// The F6 key. - F6 = 95, // 0x0000005F - - /// The F7 key. - F7 = 96, // 0x00000060 - - /// The F8 key. - F8 = 97, // 0x00000061 - - /// The F9 key. - F9 = 98, // 0x00000062 - - /// The F10 key. - F10 = 99, // 0x00000063 - - /// The F11 key. - F11 = 100, // 0x00000064 - - /// The F12 key. - F12 = 101, // 0x00000065 - - /// The F13 key. - F13 = 102, // 0x00000066 - - /// The F14 key. - F14 = 103, // 0x00000067 - - /// The F15 key. - F15 = 104, // 0x00000068 - - /// The F16 key. - F16 = 105, // 0x00000069 - - /// The F17 key. - F17 = 106, // 0x0000006A - - /// The F18 key. - F18 = 107, // 0x0000006B - - /// The F19 key. - F19 = 108, // 0x0000006C - - /// The F20 key. - F20 = 109, // 0x0000006D - - /// The F21 key. - F21 = 110, // 0x0000006E - - /// The F22 key. - F22 = 111, // 0x0000006F - - /// The F23 key. - F23 = 112, // 0x00000070 - - /// The F24 key. - F24 = 113, // 0x00000071 - - /// The Num Lock key. - NumLock = 114, // 0x00000072 - - /// The Scroll Lock key. - Scroll = 115, // 0x00000073 - - /// The left Shift key. - LeftShift = 116, // 0x00000074 - - /// The right Shift key. - RightShift = 117, // 0x00000075 - - /// The left CTRL key. - LeftCtrl = 118, // 0x00000076 - - /// The right CTRL key. - RightCtrl = 119, // 0x00000077 - - /// The left ALT key. - LeftAlt = 120, // 0x00000078 - - /// The right ALT key. - RightAlt = 121, // 0x00000079 - - /// The Browser Back key. - BrowserBack = 122, // 0x0000007A - - /// The Browser Forward key. - BrowserForward = 123, // 0x0000007B - - /// The Browser Refresh key. - BrowserRefresh = 124, // 0x0000007C - - /// The Browser Stop key. - BrowserStop = 125, // 0x0000007D - - /// The Browser Search key. - BrowserSearch = 126, // 0x0000007E - - /// The Browser Favorites key. - BrowserFavorites = 127, // 0x0000007F - - /// The Browser Home key. - BrowserHome = 128, // 0x00000080 - - /// The Volume Mute key. - VolumeMute = 129, // 0x00000081 - - /// The Volume Down key. - VolumeDown = 130, // 0x00000082 - - /// The Volume Up key. - VolumeUp = 131, // 0x00000083 - - /// The Media Next Track key. - MediaNextTrack = 132, // 0x00000084 - - /// The Media Previous Track key. - MediaPreviousTrack = 133, // 0x00000085 - - /// The Media Stop key. - MediaStop = 134, // 0x00000086 - - /// The Media Play Pause key. - MediaPlayPause = 135, // 0x00000087 - - /// The Launch Mail key. - LaunchMail = 136, // 0x00000088 - - /// The Select Media key. - SelectMedia = 137, // 0x00000089 - - /// The Launch Application1 key. - LaunchApplication1 = 138, // 0x0000008A - - /// The Launch Application2 key. - LaunchApplication2 = 139, // 0x0000008B - - /// The OEM Semicolon key. - OemSemicolon = 140, // 0x0000008C - - /// The OEM Addition key. - OemPlus = 141, // 0x0000008D - - /// The OEM Comma key. - OemComma = 142, // 0x0000008E - - /// The OEM Minus key. - OemMinus = 143, // 0x0000008F - - /// The OEM Period key. - OemPeriod = 144, // 0x00000091 - - /// The OEM Question key. - OemQuestion = 145, // 0x00000092 - - /// The OEM Tilde key. - OemTilde = 146, // 0x00000092 - - /// The ABNT_C1 (Brazilian) key. - AbntC1 = 147, // 0x00000093 - - /// The ABNT_C2 (Brazilian) key. - AbntC2 = 148, // 0x00000095 - - /// The OEM Open Brackets key. - OemOpenBrackets = 149, // 0x00000096 - - /// The OEM Pipe key. - OemPipe = 150, // 0x00000096 - - /// The OEM Close Brackets key. - OemCloseBrackets = 151, // 0x00000097 - - /// The OEM Quotes key. - OemQuotes = 152, // 0x00000098 - - /// The OEM Backslash key. - OemBackslash = 154, // 0x0000009A - - /// A special key masking the real key being processed by an IME. - ImeProcessed = 155, // 0x0000009B - - /// A special key masking the real key being processed as a system key. - System = 156, // 0x0000009C - - /// The OEM ATTN key. - OemAttn = 157, // 0x0000009D - - /// The OEM FINISH key. - OemFinish = 158, // 0x0000009E - - /// The OEM COPY key. - OemCopy = 159, // 0x0000009F - - /// The OEM AUTO key. - OemAuto = 160, // 0x000000A0 - - /// The OEM ENLW key. - OemEnlw = 161, // 0x000000A1 - - /// The OEM BACKTAB key. - OemBackTab = 162, // 0x000000A2 - - /// The ATTN key. - Attn = 163, // 0x000000A3 - - /// The CRSEL key. - CrSel = 164, // 0x000000A4 - - /// The EXSEL key. - ExSel = 165, // 0x000000A5 - - /// The ERASE EOF key. - EraseEof = 166, // 0x000000A6 - - /// The PLAY key. - Play = 167, // 0x000000A7 - - /// The ZOOM key. - Zoom = 168, // 0x000000A8 - - /// A constant reserved for future use. - NoName = 169, // 0x000000A9 - - /// The PA1 key. - Pa1 = 170, // 0x000000AA - - /// The OEM Clear key. - OemClear = 171, // 0x000000AB - - /// The key is used with another key to create a single combined character. - DeadCharProcessed = 172, // 0x000000AC, - + NumPad9, + /// The NumPad enter key NumPadEnter, @@ -548,4 +233,190 @@ public enum KeyboardKey /// The NumPad decimal key NumPadDecimal, + + /// The NumPad separator key (lower half of the "Add" key on some keyboards) + NumPadSeparator, + + /// The F1 key. + F1, + + /// The F2 key. + F2, + + /// The F3 key. + F3, + + /// The F4 key. + F4, + + /// The F5 key. + F5, + + /// The F6 key. + F6, + + /// The F7 key. + F7, + + /// The F8 key. + F8, + + /// The F9 key. + F9, + + /// The F10 key. + F10, + + /// The F11 key. + F11, + + /// The F12 key. + F12, + + /// The F13 key. + F13, + + /// The F14 key. + F14, + + /// The F15 key. + F15, + + /// The F16 key. + F16, + + /// The F17 key. + F17, + + /// The F18 key. + F18, + + /// The F19 key. + F19, + + /// The F20 key. + F20, + + /// The F21 key. + F21, + + /// The F22 key. + F22, + + /// The F23 key. + F23, + + /// The F24 key. + F24, + + /// The Scroll Lock key. + ScrollLock, + + /// The left Shift key. + LeftShift, + + /// The right Shift key. + RightShift, + + /// The left CTRL key. + LeftCtrl, + + /// The right CTRL key. + RightCtrl, + + /// The left ALT key. + LeftAlt, + + /// The right ALT key. + RightAlt, + + /// The Browser Back key. + BrowserBack, + + /// The Browser Forward key. + BrowserForward, + + /// The Browser Refresh key. + BrowserRefresh, + + /// The Browser Stop key. + BrowserStop, + + /// The Browser Search key. + BrowserSearch, + + /// The Browser Favorites key. + BrowserFavorites, + + /// The Browser Home key. + BrowserHome, + + /// The Volume Mute key. + VolumeMute, + + /// The Volume Down key. + VolumeDown, + + /// The Volume Up key. + VolumeUp, + + /// The Media Next Track key. + MediaNextTrack, + + /// The Media Previous Track key. + MediaPreviousTrack, + + /// The Media Stop key. + MediaStop, + + /// The Media Play Pause key. + MediaPlayPause, + + /// The Launch Mail key. + LaunchMail, + + /// The Select Media key. + SelectMedia, + + /// The Launch Application1 key. + FileBrowser, + + /// The Launch Application2 key. + Calculator, + + /// The Semicolon key. + OemSemicolon, + + /// The Addition key. + OemPlus, + + /// The Comma key. + OemComma, + + /// The Minus key. + OemMinus, + + /// The Period key. + OemPeriod, + + /// The Question key. + OemQuestion, + + /// The Tilde key. + OemTilde, + + /// The OEM Open Brackets key. + OemOpenBrackets, + + /// The OEM Close Brackets key. + OemCloseBrackets, + + /// The OEM Pipe key. The backslash key next to enter. + OemPipe, + + /// The OEM Quotes key. + OemQuotes, + + /// The OEM Backslash key. On iso, it's the key between left shift and Z + OemBackslash, } \ No newline at end of file diff --git a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs index b240c7f51..45608664e 100644 --- a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs +++ b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using RGB.NET.Core; namespace Artemis.Core.Services; @@ -9,199 +10,186 @@ namespace Artemis.Core.Services; public static class InputKeyUtilities { /// - /// A dictionary of mappings between and + /// Tries to convert a to a . /// - public static readonly Dictionary KeyboardKeyLedIdMap = new() + public static bool TryGetLedIdFromKeyboardKey(KeyboardKey key, out LedId ledId) { - {KeyboardKey.None, LedId.Keyboard_Custom1}, - {KeyboardKey.Cancel, LedId.Keyboard_Custom2}, - {KeyboardKey.Back, LedId.Keyboard_Backspace}, - {KeyboardKey.Tab, LedId.Keyboard_Tab}, - {KeyboardKey.LineFeed, LedId.Keyboard_Custom3}, - {KeyboardKey.Clear, LedId.Keyboard_Custom4}, - {KeyboardKey.Enter, LedId.Keyboard_Enter}, - {KeyboardKey.Pause, LedId.Keyboard_PauseBreak}, - {KeyboardKey.CapsLock, LedId.Keyboard_CapsLock}, - {KeyboardKey.HangulMode, LedId.Keyboard_Custom4}, - {KeyboardKey.JunjaMode, LedId.Keyboard_Custom5}, - {KeyboardKey.FinalMode, LedId.Keyboard_Custom6}, - {KeyboardKey.HanjaMode, LedId.Keyboard_Custom7}, - {KeyboardKey.Escape, LedId.Keyboard_Escape}, - {KeyboardKey.ImeConvert, LedId.Keyboard_Custom8}, - {KeyboardKey.ImeNonConvert, LedId.Keyboard_Custom9}, - {KeyboardKey.ImeAccept, LedId.Keyboard_Custom10}, - {KeyboardKey.ImeModeChange, LedId.Keyboard_Custom11}, - {KeyboardKey.Space, LedId.Keyboard_Space}, - {KeyboardKey.PageUp, LedId.Keyboard_PageUp}, - {KeyboardKey.PageDown, LedId.Keyboard_PageDown}, - {KeyboardKey.End, LedId.Keyboard_End}, - {KeyboardKey.Home, LedId.Keyboard_Home}, - {KeyboardKey.Left, LedId.Keyboard_ArrowLeft}, - {KeyboardKey.Up, LedId.Keyboard_ArrowUp}, - {KeyboardKey.Right, LedId.Keyboard_ArrowRight}, - {KeyboardKey.Down, LedId.Keyboard_ArrowDown}, - {KeyboardKey.Select, LedId.Keyboard_Custom12}, - {KeyboardKey.Print, LedId.Keyboard_Custom13}, - {KeyboardKey.Execute, LedId.Keyboard_Custom14}, - {KeyboardKey.PrintScreen, LedId.Keyboard_PrintScreen}, - {KeyboardKey.Insert, LedId.Keyboard_Insert}, - {KeyboardKey.Delete, LedId.Keyboard_Delete}, - {KeyboardKey.Help, LedId.Keyboard_Custom15}, - {KeyboardKey.D0, LedId.Keyboard_0}, - {KeyboardKey.D1, LedId.Keyboard_1}, - {KeyboardKey.D2, LedId.Keyboard_2}, - {KeyboardKey.D3, LedId.Keyboard_3}, - {KeyboardKey.D4, LedId.Keyboard_4}, - {KeyboardKey.D5, LedId.Keyboard_5}, - {KeyboardKey.D6, LedId.Keyboard_6}, - {KeyboardKey.D7, LedId.Keyboard_7}, - {KeyboardKey.D8, LedId.Keyboard_8}, - {KeyboardKey.D9, LedId.Keyboard_9}, - {KeyboardKey.A, LedId.Keyboard_A}, - {KeyboardKey.B, LedId.Keyboard_B}, - {KeyboardKey.C, LedId.Keyboard_C}, - {KeyboardKey.D, LedId.Keyboard_D}, - {KeyboardKey.E, LedId.Keyboard_E}, - {KeyboardKey.F, LedId.Keyboard_F}, - {KeyboardKey.G, LedId.Keyboard_G}, - {KeyboardKey.H, LedId.Keyboard_H}, - {KeyboardKey.I, LedId.Keyboard_I}, - {KeyboardKey.J, LedId.Keyboard_J}, - {KeyboardKey.K, LedId.Keyboard_K}, - {KeyboardKey.L, LedId.Keyboard_L}, - {KeyboardKey.M, LedId.Keyboard_M}, - {KeyboardKey.N, LedId.Keyboard_N}, - {KeyboardKey.O, LedId.Keyboard_O}, - {KeyboardKey.P, LedId.Keyboard_P}, - {KeyboardKey.Q, LedId.Keyboard_Q}, - {KeyboardKey.R, LedId.Keyboard_R}, - {KeyboardKey.S, LedId.Keyboard_S}, - {KeyboardKey.T, LedId.Keyboard_T}, - {KeyboardKey.U, LedId.Keyboard_U}, - {KeyboardKey.V, LedId.Keyboard_V}, - {KeyboardKey.W, LedId.Keyboard_W}, - {KeyboardKey.X, LedId.Keyboard_X}, - {KeyboardKey.Y, LedId.Keyboard_Y}, - {KeyboardKey.Z, LedId.Keyboard_Z}, - {KeyboardKey.LWin, LedId.Keyboard_LeftGui}, - {KeyboardKey.RWin, LedId.Keyboard_RightGui}, - {KeyboardKey.Apps, LedId.Keyboard_Application}, - {KeyboardKey.Sleep, LedId.Keyboard_Custom16}, - {KeyboardKey.NumPad0, LedId.Keyboard_Num0}, - {KeyboardKey.NumPad1, LedId.Keyboard_Num1}, - {KeyboardKey.NumPad2, LedId.Keyboard_Num2}, - {KeyboardKey.NumPad3, LedId.Keyboard_Num3}, - {KeyboardKey.NumPad4, LedId.Keyboard_Num4}, - {KeyboardKey.NumPad5, LedId.Keyboard_Num5}, - {KeyboardKey.NumPad6, LedId.Keyboard_Num6}, - {KeyboardKey.NumPad7, LedId.Keyboard_Num7}, - {KeyboardKey.NumPad8, LedId.Keyboard_Num8}, - {KeyboardKey.NumPad9, LedId.Keyboard_Num9}, - {KeyboardKey.Multiply, LedId.Keyboard_NumAsterisk}, - {KeyboardKey.Add, LedId.Keyboard_NumPlus}, - {KeyboardKey.Separator, LedId.Keyboard_NumEnter}, // unverified - {KeyboardKey.Subtract, LedId.Keyboard_NumMinus}, - {KeyboardKey.Decimal, LedId.Keyboard_NumPeriodAndDelete}, - {KeyboardKey.Divide, LedId.Keyboard_NumSlash}, - {KeyboardKey.F1, LedId.Keyboard_F1}, - {KeyboardKey.F2, LedId.Keyboard_F2}, - {KeyboardKey.F3, LedId.Keyboard_F3}, - {KeyboardKey.F4, LedId.Keyboard_F4}, - {KeyboardKey.F5, LedId.Keyboard_F5}, - {KeyboardKey.F6, LedId.Keyboard_F6}, - {KeyboardKey.F7, LedId.Keyboard_F7}, - {KeyboardKey.F8, LedId.Keyboard_F8}, - {KeyboardKey.F9, LedId.Keyboard_F9}, - {KeyboardKey.F10, LedId.Keyboard_F10}, - {KeyboardKey.F11, LedId.Keyboard_F11}, - {KeyboardKey.F12, LedId.Keyboard_F12}, - {KeyboardKey.F13, LedId.Keyboard_Custom17}, - {KeyboardKey.F14, LedId.Keyboard_Custom18}, - {KeyboardKey.F15, LedId.Keyboard_Custom19}, - {KeyboardKey.F16, LedId.Keyboard_Custom20}, - {KeyboardKey.F17, LedId.Keyboard_Custom21}, - {KeyboardKey.F18, LedId.Keyboard_Custom22}, - {KeyboardKey.F19, LedId.Keyboard_Custom23}, - {KeyboardKey.F20, LedId.Keyboard_Custom24}, - {KeyboardKey.F21, LedId.Keyboard_Custom25}, - {KeyboardKey.F22, LedId.Keyboard_Custom26}, - {KeyboardKey.F23, LedId.Keyboard_Custom27}, - {KeyboardKey.F24, LedId.Keyboard_Custom28}, - {KeyboardKey.NumLock, LedId.Keyboard_NumLock}, - {KeyboardKey.Scroll, LedId.Keyboard_ScrollLock}, - {KeyboardKey.LeftShift, LedId.Keyboard_LeftShift}, - {KeyboardKey.RightShift, LedId.Keyboard_RightShift}, - {KeyboardKey.LeftCtrl, LedId.Keyboard_LeftCtrl}, - {KeyboardKey.RightCtrl, LedId.Keyboard_RightCtrl}, - {KeyboardKey.LeftAlt, LedId.Keyboard_LeftAlt}, - {KeyboardKey.RightAlt, LedId.Keyboard_RightAlt}, - {KeyboardKey.BrowserBack, LedId.Keyboard_Custom29}, - {KeyboardKey.BrowserForward, LedId.Keyboard_Custom30}, - {KeyboardKey.BrowserRefresh, LedId.Keyboard_Custom31}, - {KeyboardKey.BrowserStop, LedId.Keyboard_Custom32}, - {KeyboardKey.BrowserSearch, LedId.Keyboard_Custom33}, - {KeyboardKey.BrowserFavorites, LedId.Keyboard_Custom34}, - {KeyboardKey.BrowserHome, LedId.Keyboard_Custom35}, - {KeyboardKey.VolumeMute, LedId.Keyboard_MediaMute}, - {KeyboardKey.VolumeDown, LedId.Keyboard_MediaVolumeDown}, - {KeyboardKey.VolumeUp, LedId.Keyboard_MediaVolumeUp}, - {KeyboardKey.MediaNextTrack, LedId.Keyboard_MediaNextTrack}, - {KeyboardKey.MediaPreviousTrack, LedId.Keyboard_MediaPreviousTrack}, - {KeyboardKey.MediaStop, LedId.Keyboard_MediaStop}, - {KeyboardKey.MediaPlayPause, LedId.Keyboard_MediaPlay}, - {KeyboardKey.LaunchMail, LedId.Keyboard_Custom36}, - {KeyboardKey.SelectMedia, LedId.Keyboard_Custom37}, - {KeyboardKey.LaunchApplication1, LedId.Keyboard_Custom38}, - {KeyboardKey.LaunchApplication2, LedId.Keyboard_Custom39}, - {KeyboardKey.OemSemicolon, LedId.Keyboard_SemicolonAndColon}, - {KeyboardKey.OemPlus, LedId.Keyboard_EqualsAndPlus}, - {KeyboardKey.OemMinus, LedId.Keyboard_MinusAndUnderscore}, - {KeyboardKey.OemComma, LedId.Keyboard_CommaAndLessThan}, - {KeyboardKey.OemPeriod, LedId.Keyboard_PeriodAndBiggerThan}, - {KeyboardKey.OemQuestion, LedId.Keyboard_SlashAndQuestionMark}, - {KeyboardKey.OemTilde, LedId.Keyboard_GraveAccentAndTilde}, - {KeyboardKey.AbntC1, LedId.Keyboard_Custom40}, - {KeyboardKey.AbntC2, LedId.Keyboard_Custom41}, - {KeyboardKey.OemOpenBrackets, LedId.Keyboard_BracketLeft}, - {KeyboardKey.OemPipe, LedId.Keyboard_Backslash}, - {KeyboardKey.OemCloseBrackets, LedId.Keyboard_BracketRight}, - {KeyboardKey.OemQuotes, LedId.Keyboard_ApostropheAndDoubleQuote}, - {KeyboardKey.OemBackslash, LedId.Keyboard_NonUsBackslash}, - {KeyboardKey.ImeProcessed, LedId.Keyboard_Custom43}, - {KeyboardKey.System, LedId.Keyboard_Custom44}, - {KeyboardKey.OemAttn, LedId.Keyboard_Custom45}, - {KeyboardKey.OemFinish, LedId.Keyboard_Custom46}, - {KeyboardKey.OemCopy, LedId.Keyboard_Custom47}, - {KeyboardKey.OemAuto, LedId.Keyboard_Custom48}, - {KeyboardKey.OemEnlw, LedId.Keyboard_Custom49}, - {KeyboardKey.OemBackTab, LedId.Keyboard_Custom50}, - {KeyboardKey.Attn, LedId.Keyboard_Custom51}, - {KeyboardKey.CrSel, LedId.Keyboard_Custom52}, - {KeyboardKey.ExSel, LedId.Keyboard_Custom53}, - {KeyboardKey.EraseEof, LedId.Keyboard_Custom54}, - {KeyboardKey.Play, LedId.Keyboard_MediaPlay}, - {KeyboardKey.Zoom, LedId.Keyboard_Custom55}, - {KeyboardKey.NoName, LedId.Keyboard_Custom56}, - {KeyboardKey.Pa1, LedId.Keyboard_Custom57}, - {KeyboardKey.OemClear, LedId.Keyboard_Custom58}, - {KeyboardKey.DeadCharProcessed, LedId.Keyboard_Custom59}, - {KeyboardKey.NumPadEnter, LedId.Keyboard_NumEnter}, - {KeyboardKey.NumPadDecimal, LedId.Keyboard_NumPeriodAndDelete}, - {KeyboardKey.NumPadDivide, LedId.Keyboard_NumSlash}, - {KeyboardKey.NumPadMultiply, LedId.Keyboard_NumAsterisk}, - {KeyboardKey.NumPadSubtract, LedId.Keyboard_NumMinus}, - {KeyboardKey.NumPadAdd, LedId.Keyboard_NumPlus}, - }; - + ledId = LedIdFromKeyboardKey(key); + return ledId != LedId.Invalid; + } + /// - /// A dictionary of mappings between and + /// Tries to convert a to a . /// - public static readonly Dictionary MouseButtonLedIdMap = new() + public static bool TryGetLedIdFromMouseButton(MouseButton button, out LedId ledId) { - {MouseButton.Left, LedId.Mouse1}, - {MouseButton.Middle, LedId.Mouse2}, - {MouseButton.Right, LedId.Mouse3}, - {MouseButton.Button4, LedId.Mouse4}, - {MouseButton.Button5, LedId.Mouse5} - }; + ledId = LedIdFromMouseButton(button); + return ledId != LedId.Invalid; + } + + /// + /// Converts a to a . + /// + public static LedId LedIdFromKeyboardKey(KeyboardKey key) + { + return key switch + { + KeyboardKey.None => LedId.Keyboard_Custom1, + KeyboardKey.Backspace => LedId.Keyboard_Backspace, + KeyboardKey.Tab => LedId.Keyboard_Tab, + KeyboardKey.Clear => LedId.Keyboard_Custom4, + KeyboardKey.Enter => LedId.Keyboard_Enter, + KeyboardKey.PauseBreak => LedId.Keyboard_PauseBreak, + KeyboardKey.CapsLock => LedId.Keyboard_CapsLock, + KeyboardKey.Escape => LedId.Keyboard_Escape, + KeyboardKey.Space => LedId.Keyboard_Space, + KeyboardKey.PageUp => LedId.Keyboard_PageUp, + KeyboardKey.PageDown => LedId.Keyboard_PageDown, + KeyboardKey.End => LedId.Keyboard_End, + KeyboardKey.Home => LedId.Keyboard_Home, + KeyboardKey.ArrowLeft => LedId.Keyboard_ArrowLeft, + KeyboardKey.ArrowUp => LedId.Keyboard_ArrowUp, + KeyboardKey.ArrowRight => LedId.Keyboard_ArrowRight, + KeyboardKey.ArrowDown => LedId.Keyboard_ArrowDown, + KeyboardKey.PrintScreen => LedId.Keyboard_PrintScreen, + KeyboardKey.Insert => LedId.Keyboard_Insert, + KeyboardKey.Delete => LedId.Keyboard_Delete, + KeyboardKey.D0 => LedId.Keyboard_0, + KeyboardKey.D1 => LedId.Keyboard_1, + KeyboardKey.D2 => LedId.Keyboard_2, + KeyboardKey.D3 => LedId.Keyboard_3, + KeyboardKey.D4 => LedId.Keyboard_4, + KeyboardKey.D5 => LedId.Keyboard_5, + KeyboardKey.D6 => LedId.Keyboard_6, + KeyboardKey.D7 => LedId.Keyboard_7, + KeyboardKey.D8 => LedId.Keyboard_8, + KeyboardKey.D9 => LedId.Keyboard_9, + KeyboardKey.A => LedId.Keyboard_A, + KeyboardKey.B => LedId.Keyboard_B, + KeyboardKey.C => LedId.Keyboard_C, + KeyboardKey.D => LedId.Keyboard_D, + KeyboardKey.E => LedId.Keyboard_E, + KeyboardKey.F => LedId.Keyboard_F, + KeyboardKey.G => LedId.Keyboard_G, + KeyboardKey.H => LedId.Keyboard_H, + KeyboardKey.I => LedId.Keyboard_I, + KeyboardKey.J => LedId.Keyboard_J, + KeyboardKey.K => LedId.Keyboard_K, + KeyboardKey.L => LedId.Keyboard_L, + KeyboardKey.M => LedId.Keyboard_M, + KeyboardKey.N => LedId.Keyboard_N, + KeyboardKey.O => LedId.Keyboard_O, + KeyboardKey.P => LedId.Keyboard_P, + KeyboardKey.Q => LedId.Keyboard_Q, + KeyboardKey.R => LedId.Keyboard_R, + KeyboardKey.S => LedId.Keyboard_S, + KeyboardKey.T => LedId.Keyboard_T, + KeyboardKey.U => LedId.Keyboard_U, + KeyboardKey.V => LedId.Keyboard_V, + KeyboardKey.W => LedId.Keyboard_W, + KeyboardKey.X => LedId.Keyboard_X, + KeyboardKey.Y => LedId.Keyboard_Y, + KeyboardKey.Z => LedId.Keyboard_Z, + KeyboardKey.LeftWin => LedId.Keyboard_LeftGui, + KeyboardKey.RightWin => LedId.Keyboard_RightGui, + KeyboardKey.Application => LedId.Keyboard_Application, + KeyboardKey.Sleep => LedId.Keyboard_Custom16, + KeyboardKey.NumPad0 => LedId.Keyboard_Num0, + KeyboardKey.NumPad1 => LedId.Keyboard_Num1, + KeyboardKey.NumPad2 => LedId.Keyboard_Num2, + KeyboardKey.NumPad3 => LedId.Keyboard_Num3, + KeyboardKey.NumPad4 => LedId.Keyboard_Num4, + KeyboardKey.NumPad5 => LedId.Keyboard_Num5, + KeyboardKey.NumPad6 => LedId.Keyboard_Num6, + KeyboardKey.NumPad7 => LedId.Keyboard_Num7, + KeyboardKey.NumPad8 => LedId.Keyboard_Num8, + KeyboardKey.NumPad9 => LedId.Keyboard_Num9, + KeyboardKey.NumPadMultiply => LedId.Keyboard_NumAsterisk, + KeyboardKey.NumPadAdd => LedId.Keyboard_NumPlus, + KeyboardKey.NumPadSeparator => LedId.Keyboard_NumEnter, + KeyboardKey.NumPadSubtract => LedId.Keyboard_NumMinus, + KeyboardKey.NumPadDecimal => LedId.Keyboard_NumPeriodAndDelete, + KeyboardKey.NumPadDivide => LedId.Keyboard_NumSlash, + KeyboardKey.F1 => LedId.Keyboard_F1, + KeyboardKey.F2 => LedId.Keyboard_F2, + KeyboardKey.F3 => LedId.Keyboard_F3, + KeyboardKey.F4 => LedId.Keyboard_F4, + KeyboardKey.F5 => LedId.Keyboard_F5, + KeyboardKey.F6 => LedId.Keyboard_F6, + KeyboardKey.F7 => LedId.Keyboard_F7, + KeyboardKey.F8 => LedId.Keyboard_F8, + KeyboardKey.F9 => LedId.Keyboard_F9, + KeyboardKey.F10 => LedId.Keyboard_F10, + KeyboardKey.F11 => LedId.Keyboard_F11, + KeyboardKey.F12 => LedId.Keyboard_F12, + KeyboardKey.F13 => LedId.Keyboard_Custom17, + KeyboardKey.F14 => LedId.Keyboard_Custom18, + KeyboardKey.F15 => LedId.Keyboard_Custom19, + KeyboardKey.F16 => LedId.Keyboard_Custom20, + KeyboardKey.F17 => LedId.Keyboard_Custom21, + KeyboardKey.F18 => LedId.Keyboard_Custom22, + KeyboardKey.F19 => LedId.Keyboard_Custom23, + KeyboardKey.F20 => LedId.Keyboard_Custom24, + KeyboardKey.F21 => LedId.Keyboard_Custom25, + KeyboardKey.F22 => LedId.Keyboard_Custom26, + KeyboardKey.F23 => LedId.Keyboard_Custom27, + KeyboardKey.F24 => LedId.Keyboard_Custom28, + KeyboardKey.NumLock => LedId.Keyboard_NumLock, + KeyboardKey.ScrollLock => LedId.Keyboard_ScrollLock, + KeyboardKey.LeftShift => LedId.Keyboard_LeftShift, + KeyboardKey.RightShift => LedId.Keyboard_RightShift, + KeyboardKey.LeftCtrl => LedId.Keyboard_LeftCtrl, + KeyboardKey.RightCtrl => LedId.Keyboard_RightCtrl, + KeyboardKey.LeftAlt => LedId.Keyboard_LeftAlt, + KeyboardKey.RightAlt => LedId.Keyboard_RightAlt, + KeyboardKey.BrowserBack => LedId.Keyboard_Custom29, + KeyboardKey.BrowserForward => LedId.Keyboard_Custom30, + KeyboardKey.BrowserRefresh => LedId.Keyboard_Custom31, + KeyboardKey.BrowserStop => LedId.Keyboard_Custom32, + KeyboardKey.BrowserSearch => LedId.Keyboard_Custom33, + KeyboardKey.BrowserFavorites => LedId.Keyboard_Custom34, + KeyboardKey.BrowserHome => LedId.Keyboard_Custom35, + KeyboardKey.VolumeMute => LedId.Keyboard_MediaMute, + KeyboardKey.VolumeDown => LedId.Keyboard_MediaVolumeDown, + KeyboardKey.VolumeUp => LedId.Keyboard_MediaVolumeUp, + KeyboardKey.MediaNextTrack => LedId.Keyboard_MediaNextTrack, + KeyboardKey.MediaPreviousTrack => LedId.Keyboard_MediaPreviousTrack, + KeyboardKey.MediaStop => LedId.Keyboard_MediaStop, + KeyboardKey.MediaPlayPause => LedId.Keyboard_MediaPlay, + KeyboardKey.LaunchMail => LedId.Keyboard_Custom36, + KeyboardKey.SelectMedia => LedId.Keyboard_Custom37, + KeyboardKey.FileBrowser => LedId.Keyboard_Custom38, + KeyboardKey.Calculator => LedId.Keyboard_Custom39, + KeyboardKey.OemSemicolon => LedId.Keyboard_SemicolonAndColon, + KeyboardKey.OemPlus => LedId.Keyboard_EqualsAndPlus, + KeyboardKey.OemMinus => LedId.Keyboard_MinusAndUnderscore, + KeyboardKey.OemComma => LedId.Keyboard_CommaAndLessThan, + KeyboardKey.OemPeriod => LedId.Keyboard_PeriodAndBiggerThan, + KeyboardKey.OemQuestion => LedId.Keyboard_SlashAndQuestionMark, + KeyboardKey.OemTilde => LedId.Keyboard_GraveAccentAndTilde, + KeyboardKey.OemOpenBrackets => LedId.Keyboard_BracketLeft, + KeyboardKey.OemPipe => LedId.Keyboard_Backslash, + KeyboardKey.OemCloseBrackets => LedId.Keyboard_BracketRight, + KeyboardKey.OemQuotes => LedId.Keyboard_ApostropheAndDoubleQuote, + KeyboardKey.OemBackslash => LedId.Keyboard_NonUsBackslash, + KeyboardKey.NumPadEnter => LedId.Keyboard_NumEnter, + _ => LedId.Invalid + }; + } + + /// + /// Converts a to a + /// + public static LedId LedIdFromMouseButton(MouseButton button) + { + return button switch + { + MouseButton.Left => LedId.Mouse1, + MouseButton.Middle => LedId.Mouse2, + MouseButton.Right => LedId.Mouse3, + MouseButton.Button4 => LedId.Mouse4, + MouseButton.Button5 => LedId.Mouse5, + _ => LedId.Invalid + }; + } } \ No newline at end of file diff --git a/src/Artemis.Core/Services/Input/InputService.cs b/src/Artemis.Core/Services/Input/InputService.cs index fa6c983f4..a7502c6ef 100644 --- a/src/Artemis.Core/Services/Input/InputService.cs +++ b/src/Artemis.Core/Services/Input/InputService.cs @@ -268,7 +268,7 @@ internal class InputService : IInputService return; // Get the LED - bool foundLedId = InputKeyUtilities.KeyboardKeyLedIdMap.TryGetValue(e.Key, out LedId ledId); + bool foundLedId = InputKeyUtilities.TryGetLedIdFromKeyboardKey(e.Key, out LedId ledId); // If we find a backslash but the keyboard is ISO, we need to use the non-US backslash. // The scancode is the same, but the LED ID is different if (ledId == LedId.Keyboard_Backslash && e.Device?.PhysicalLayout == KeyboardLayoutType.ISO) @@ -355,7 +355,7 @@ internal class InputService : IInputService else modifiers &= ~KeyboardModifierKey.Shift; } - else if (key == KeyboardKey.LWin || key == KeyboardKey.RWin) + else if (key == KeyboardKey.LeftWin || key == KeyboardKey.RightWin) { if (isDown) modifiers |= KeyboardModifierKey.Windows; @@ -394,7 +394,7 @@ internal class InputService : IInputService private void InputProviderOnMouseButtonDataReceived(object? sender, InputProviderMouseButtonEventArgs e) { - bool foundLedId = InputKeyUtilities.MouseButtonLedIdMap.TryGetValue(e.Button, out LedId ledId); + bool foundLedId = InputKeyUtilities.TryGetLedIdFromMouseButton(e.Button, out LedId ledId); ArtemisLed? led = null; if (foundLedId && e.Device != null) led = e.Device.Leds.FirstOrDefault(l => l.RgbLed.Id == ledId); diff --git a/src/Artemis.UI.Linux/Utilities/InputUtilities.cs b/src/Artemis.UI.Linux/Utilities/InputUtilities.cs index 44017e602..f898ebb1e 100644 --- a/src/Artemis.UI.Linux/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Linux/Utilities/InputUtilities.cs @@ -23,7 +23,7 @@ public static class InputUtilities LinuxKeyboardKeyCodes.KEY_0 => KeyboardKey.D0, LinuxKeyboardKeyCodes.KEY_MINUS => KeyboardKey.OemMinus, LinuxKeyboardKeyCodes.KEY_EQUAL => KeyboardKey.OemPlus, - LinuxKeyboardKeyCodes.KEY_BACKSPACE => KeyboardKey.Back, + LinuxKeyboardKeyCodes.KEY_BACKSPACE => KeyboardKey.Backspace, LinuxKeyboardKeyCodes.KEY_TAB => KeyboardKey.Tab, LinuxKeyboardKeyCodes.KEY_Q => KeyboardKey.Q, LinuxKeyboardKeyCodes.KEY_W => KeyboardKey.W, @@ -79,20 +79,20 @@ public static class InputUtilities LinuxKeyboardKeyCodes.KEY_F9 => KeyboardKey.F9, LinuxKeyboardKeyCodes.KEY_F10 => KeyboardKey.F10, LinuxKeyboardKeyCodes.KEY_NUMLOCK => KeyboardKey.NumLock, - LinuxKeyboardKeyCodes.KEY_SCROLLLOCK => KeyboardKey.Scroll, + LinuxKeyboardKeyCodes.KEY_SCROLLLOCK => KeyboardKey.ScrollLock, LinuxKeyboardKeyCodes.KEY_KP7 => KeyboardKey.NumPad7, LinuxKeyboardKeyCodes.KEY_KP8 => KeyboardKey.NumPad8, LinuxKeyboardKeyCodes.KEY_KP9 => KeyboardKey.NumPad9, - LinuxKeyboardKeyCodes.KEY_KPMINUS => KeyboardKey.Subtract, + LinuxKeyboardKeyCodes.KEY_KPMINUS => KeyboardKey.NumPadSubtract, LinuxKeyboardKeyCodes.KEY_KP4 => KeyboardKey.NumPad4, LinuxKeyboardKeyCodes.KEY_KP5 => KeyboardKey.NumPad5, LinuxKeyboardKeyCodes.KEY_KP6 => KeyboardKey.NumPad6, - LinuxKeyboardKeyCodes.KEY_KPPLUS => KeyboardKey.Add, + LinuxKeyboardKeyCodes.KEY_KPPLUS => KeyboardKey.NumPadAdd, LinuxKeyboardKeyCodes.KEY_KP1 => KeyboardKey.NumPad1, LinuxKeyboardKeyCodes.KEY_KP2 => KeyboardKey.NumPad2, LinuxKeyboardKeyCodes.KEY_KP3 => KeyboardKey.NumPad3, LinuxKeyboardKeyCodes.KEY_KP0 => KeyboardKey.NumPad0, - LinuxKeyboardKeyCodes.KEY_KPDOT => KeyboardKey.Decimal, + LinuxKeyboardKeyCodes.KEY_KPDOT => KeyboardKey.NumPadDecimal, // LinuxKeyboardKeyCodes.KEY_ZENKAKUHANKAKU => expr, // LinuxKeyboardKeyCodes.KEY_102ND => expr, LinuxKeyboardKeyCodes.KEY_F11 => KeyboardKey.F11, @@ -106,17 +106,16 @@ public static class InputUtilities // LinuxKeyboardKeyCodes.KEY_KPJPCOMMA => expr, LinuxKeyboardKeyCodes.KEY_KPENTER => KeyboardKey.NumPadEnter, LinuxKeyboardKeyCodes.KEY_RIGHTCTRL => KeyboardKey.RightCtrl, - LinuxKeyboardKeyCodes.KEY_KPSLASH => KeyboardKey.Divide, + LinuxKeyboardKeyCodes.KEY_KPSLASH => KeyboardKey.NumPadDivide, LinuxKeyboardKeyCodes.KEY_SYSRQ => KeyboardKey.PrintScreen, LinuxKeyboardKeyCodes.KEY_RIGHTALT => KeyboardKey.RightAlt, - LinuxKeyboardKeyCodes.KEY_LINEFEED => KeyboardKey.LineFeed, LinuxKeyboardKeyCodes.KEY_HOME => KeyboardKey.Home, - LinuxKeyboardKeyCodes.KEY_UP => KeyboardKey.Up, + LinuxKeyboardKeyCodes.KEY_UP => KeyboardKey.ArrowUp, LinuxKeyboardKeyCodes.KEY_PAGEUP => KeyboardKey.PageUp, - LinuxKeyboardKeyCodes.KEY_LEFT => KeyboardKey.Left, - LinuxKeyboardKeyCodes.KEY_RIGHT => KeyboardKey.Right, + LinuxKeyboardKeyCodes.KEY_LEFT => KeyboardKey.ArrowLeft, + LinuxKeyboardKeyCodes.KEY_RIGHT => KeyboardKey.ArrowRight, LinuxKeyboardKeyCodes.KEY_END => KeyboardKey.End, - LinuxKeyboardKeyCodes.KEY_DOWN => KeyboardKey.Down, + LinuxKeyboardKeyCodes.KEY_DOWN => KeyboardKey.ArrowDown, LinuxKeyboardKeyCodes.KEY_PAGEDOWN => KeyboardKey.PageDown, LinuxKeyboardKeyCodes.KEY_INSERT => KeyboardKey.Insert, LinuxKeyboardKeyCodes.KEY_DELETE => KeyboardKey.Delete, @@ -127,15 +126,15 @@ public static class InputUtilities // LinuxKeyboardKeyCodes.KEY_POWER => KeyboardKey.power, LinuxKeyboardKeyCodes.KEY_KPEQUAL => KeyboardKey.NumPadEnter, //todo: ? // LinuxKeyboardKeyCodes.KEY_KPPLUSMINUS => KeyboardKey.numpad, - LinuxKeyboardKeyCodes.KEY_PAUSE => KeyboardKey.Pause, + LinuxKeyboardKeyCodes.KEY_PAUSE => KeyboardKey.PauseBreak, // LinuxKeyboardKeyCodes.KEY_SCALE => KeyboardKey.scal, // LinuxKeyboardKeyCodes.KEY_KPCOMMA => KeyboardKey.ke, // LinuxKeyboardKeyCodes.KEY_HANGEUL => expr, // LinuxKeyboardKeyCodes.KEY_HANJA => expr, // LinuxKeyboardKeyCodes.KEY_YEN => expr, - LinuxKeyboardKeyCodes.KEY_LEFTMETA => KeyboardKey.LWin, - LinuxKeyboardKeyCodes.KEY_RIGHTMETA => KeyboardKey.RWin, - LinuxKeyboardKeyCodes.KEY_COMPOSE => KeyboardKey.Apps, + LinuxKeyboardKeyCodes.KEY_LEFTMETA => KeyboardKey.LeftWin, + LinuxKeyboardKeyCodes.KEY_RIGHTMETA => KeyboardKey.RightWin, + LinuxKeyboardKeyCodes.KEY_COMPOSE => KeyboardKey.Application, LinuxKeyboardKeyCodes.KEY_STOP => KeyboardKey.MediaStop, // LinuxKeyboardKeyCodes.KEY_AGAIN => , // LinuxKeyboardKeyCodes.KEY_PROPS => expr, diff --git a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs index 1adc2b292..2c375b3e4 100644 --- a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs +++ b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs @@ -105,7 +105,7 @@ public class WindowsInputProvider : InputProvider } catch (Exception e) { - _logger.Error("Failed to convert virtual key to Artemis key, please share this log with the developers. ScanCode: {scanCode} VK: {virtualKey} Flags: {flags}", + _logger.Error(e, "Failed to convert virtual key to Artemis key, please share this log with the developers. ScanCode: {scanCode} VK: {virtualKey} Flags: {flags}", keyboardData.Keyboard.ScanCode, keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.Flags); } // Debug.WriteLine($"VK: {key} ({keyboardData.Keyboard.VirutalKey}), Flags: {keyboardData.Keyboard.Flags}, Scan code: {keyboardData.Keyboard.ScanCode}"); @@ -130,9 +130,7 @@ public class WindowsInputProvider : InputProvider _logger.Warning(e, "Failed to retrieve input device by its identifier"); } - bool isDown = keyboardData.Keyboard.Flags != RawKeyboardFlags.Up && - keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE0) && - keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE1); + bool isDown = (keyboardData.Keyboard.Flags & RawKeyboardFlags.Up) == 0; OnKeyboardDataReceived(device, key, isDown); UpdateToggleStatus(); @@ -143,7 +141,7 @@ public class WindowsInputProvider : InputProvider OnKeyboardToggleStatusReceived(new KeyboardToggleStatus( InputUtilities.IsKeyToggled(KeyboardKey.NumLock), InputUtilities.IsKeyToggled(KeyboardKey.CapsLock), - InputUtilities.IsKeyToggled(KeyboardKey.Scroll) + InputUtilities.IsKeyToggled(KeyboardKey.ScrollLock) )); } @@ -201,39 +199,24 @@ public class WindowsInputProvider : InputProvider } // Button presses - MouseButton button = MouseButton.Left; - bool isDown = false; - - // Left - if (DetermineMouseButton(mouseData, RawMouseButtonFlags.LeftButtonDown, RawMouseButtonFlags.LeftButtonUp, ref isDown)) - button = MouseButton.Left; - // Middle - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.MiddleButtonDown, RawMouseButtonFlags.MiddleButtonUp, ref isDown)) - button = MouseButton.Middle; - // Right - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.RightButtonDown, RawMouseButtonFlags.RightButtonUp, ref isDown)) - button = MouseButton.Right; - // Button 4 - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.Button4Down, RawMouseButtonFlags.Button4Up, ref isDown)) - button = MouseButton.Button4; - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.Button5Down, RawMouseButtonFlags.Button5Up, ref isDown)) - button = MouseButton.Button5; + (MouseButton button, bool isDown) = mouseData.Mouse.Buttons switch + { + RawMouseButtonFlags.LeftButtonDown => (MouseButton.Left, true), + RawMouseButtonFlags.LeftButtonUp => (MouseButton.Left, false), + RawMouseButtonFlags.MiddleButtonDown => (MouseButton.Middle, true), + RawMouseButtonFlags.MiddleButtonUp => (MouseButton.Middle, false), + RawMouseButtonFlags.RightButtonDown => (MouseButton.Right, true), + RawMouseButtonFlags.RightButtonUp => (MouseButton.Right, false), + RawMouseButtonFlags.Button4Down => (MouseButton.Button4, true), + RawMouseButtonFlags.Button4Up => (MouseButton.Button4, false), + RawMouseButtonFlags.Button5Down => (MouseButton.Button5, true), + RawMouseButtonFlags.Button5Up => (MouseButton.Button5, false), + _ => (MouseButton.Left, false) + }; OnMouseButtonDataReceived(device, button, isDown); } - private bool DetermineMouseButton(RawInputMouseData data, RawMouseButtonFlags downButton, RawMouseButtonFlags upButton, ref bool isDown) - { - if (data.Mouse.Buttons == downButton || data.Mouse.Buttons == upButton) - { - isDown = data.Mouse.Buttons == downButton; - return true; - } - - isDown = false; - return false; - } - #endregion #region Native diff --git a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs index d6b5a2fc6..663ec341e 100644 --- a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs @@ -14,10 +14,7 @@ public static class InputUtilities { [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern short GetKeyState(int keyCode); - - [DllImport("user32.dll")] - private static extern uint MapVirtualKey(uint uCode, MapVirtualKeyMapTypes uMapType); - + [Flags] private enum KeyStates { @@ -25,48 +22,7 @@ public static class InputUtilities Down = 1, Toggled = 2 } - - /// - /// The set of valid MapTypes used in MapVirtualKey - /// - private enum MapVirtualKeyMapTypes : uint - { - /// - /// uCode is a virtual-key code and is translated into a scan code. - /// If it is a virtual-key code that does not distinguish between left- and - /// right-hand keys, the left-hand scan code is returned. - /// If there is no translation, the function returns 0. - /// - MAPVK_VK_TO_VSC = 0x00, - /// - /// uCode is a scan code and is translated into a virtual-key code that - /// does not distinguish between left- and right-hand keys. If there is no - /// translation, the function returns 0. - /// - MAPVK_VSC_TO_VK = 0x01, - - /// - /// uCode is a virtual-key code and is translated into an unshifted - /// character value in the low-order word of the return value. Dead keys (diacritics) - /// are indicated by setting the top bit of the return value. If there is no - /// translation, the function returns 0. - /// - MAPVK_VK_TO_CHAR = 0x02, - - /// - /// Windows NT/2000/XP: uCode is a scan code and is translated into a - /// virtual-key code that distinguishes between left- and right-hand keys. If - /// there is no translation, the function returns 0. - /// - MAPVK_VSC_TO_VK_EX = 0x03, - - /// - /// Not currently documented - /// - MAPVK_VK_TO_VSC_EX = 0x04 - } - private readonly record struct KeystrokeInfo(int ScanCode, int VirtualKey, bool IsE0, bool IsE1); /// @@ -82,6 +38,12 @@ public static class InputUtilities IsE1 = (flags & 4) != 0 }; + if (info.ScanCode == 0) + { + // These keys are media or browser keys, they don't have a scan code + return KeyFromVirtualKey(info.VirtualKey); + } + return info switch { // Fake keys, usually escape sequences @@ -90,8 +52,8 @@ public static class InputUtilities { ScanCode: 56, VirtualKey: NativeMethods.VK_CONTROL, IsE0: true } => KeyboardKey.None, { ScanCode: 28, IsE0: true } => KeyboardKey.NumPadEnter, - { ScanCode: 28, IsE0: false } => KeyboardKey.Return, - { ScanCode: 29, IsE1: true } => KeyboardKey.Pause, + { ScanCode: 28, IsE0: false } => KeyboardKey.Enter, + { ScanCode: 29, IsE1: true } => KeyboardKey.PauseBreak, { ScanCode: 29, IsE0: true } => KeyboardKey.RightCtrl, { ScanCode: 29, IsE0: false } => KeyboardKey.LeftCtrl, { ScanCode: 56, IsE0: true } => KeyboardKey.RightAlt, @@ -102,19 +64,19 @@ public static class InputUtilities { ScanCode: 55, IsE0: false } => KeyboardKey.NumPadMultiply, { ScanCode: 71, IsE0: true } => KeyboardKey.Home, { ScanCode: 71, IsE0: false } => KeyboardKey.NumPad7, - { ScanCode: 72, IsE0: true } => KeyboardKey.Up, + { ScanCode: 72, IsE0: true } => KeyboardKey.ArrowUp, { ScanCode: 72, IsE0: false } => KeyboardKey.NumPad8, { ScanCode: 73, IsE0: true } => KeyboardKey.PageUp, { ScanCode: 73, IsE0: false } => KeyboardKey.NumPad9, - { ScanCode: 75, IsE0: true } => KeyboardKey.Left, + { ScanCode: 75, IsE0: true } => KeyboardKey.ArrowLeft, { ScanCode: 75, IsE0: false } => KeyboardKey.NumPad4, { ScanCode: 76, IsE0: true } => KeyboardKey.Clear, { ScanCode: 76, IsE0: false } => KeyboardKey.NumPad5, - { ScanCode: 77, IsE0: true } => KeyboardKey.Right, + { ScanCode: 77, IsE0: true } => KeyboardKey.ArrowRight, { ScanCode: 77, IsE0: false } => KeyboardKey.NumPad6, { ScanCode: 79, IsE0: true } => KeyboardKey.End, { ScanCode: 79, IsE0: false } => KeyboardKey.NumPad1, - { ScanCode: 80, IsE0: true } => KeyboardKey.Down, + { ScanCode: 80, IsE0: true } => KeyboardKey.ArrowDown, { ScanCode: 80, IsE0: false } => KeyboardKey.NumPad2, { ScanCode: 81, IsE0: true } => KeyboardKey.PageDown, { ScanCode: 81, IsE0: false } => KeyboardKey.NumPad3, @@ -125,10 +87,6 @@ public static class InputUtilities _ => KeyFromScanCode((uint)info.ScanCode), }; } - public static bool IsKeyDown(KeyboardKey key) - { - return KeyStates.Down == (GetKeyState(key) & KeyStates.Down); - } public static bool IsKeyToggled(KeyboardKey key) { @@ -160,35 +118,25 @@ public static class InputUtilities { return virtualKey switch { - NativeMethods.VK_CANCEL => KeyboardKey.Cancel, - NativeMethods.VK_BACK => KeyboardKey.Back, + NativeMethods.VK_BACK => KeyboardKey.Backspace, NativeMethods.VK_TAB => KeyboardKey.Tab, NativeMethods.VK_CLEAR => KeyboardKey.Clear, - NativeMethods.VK_RETURN => KeyboardKey.Return, - NativeMethods.VK_PAUSE => KeyboardKey.Pause, + NativeMethods.VK_RETURN => KeyboardKey.Enter, + NativeMethods.VK_PAUSE => KeyboardKey.PauseBreak, NativeMethods.VK_CAPSLOCK => KeyboardKey.CapsLock, - NativeMethods.VK_JUNJA => KeyboardKey.JunjaMode, - NativeMethods.VK_FINAL => KeyboardKey.FinalMode, NativeMethods.VK_ESCAPE => KeyboardKey.Escape, - NativeMethods.VK_CONVERT => KeyboardKey.ImeConvert, - NativeMethods.VK_NONCONVERT => KeyboardKey.ImeNonConvert, - NativeMethods.VK_ACCEPT => KeyboardKey.ImeAccept, - NativeMethods.VK_MODECHANGE => KeyboardKey.ImeModeChange, NativeMethods.VK_SPACE => KeyboardKey.Space, NativeMethods.VK_PRIOR => KeyboardKey.PageUp, NativeMethods.VK_NEXT => KeyboardKey.PageDown, NativeMethods.VK_END => KeyboardKey.End, NativeMethods.VK_HOME => KeyboardKey.Home, - NativeMethods.VK_LEFT => KeyboardKey.Left, - NativeMethods.VK_UP => KeyboardKey.Up, - NativeMethods.VK_RIGHT => KeyboardKey.Right, - NativeMethods.VK_DOWN => KeyboardKey.Down, - NativeMethods.VK_SELECT => KeyboardKey.Select, - NativeMethods.VK_PRINT => KeyboardKey.Print, - NativeMethods.VK_EXECUTE => KeyboardKey.Execute, + NativeMethods.VK_LEFT => KeyboardKey.ArrowLeft, + NativeMethods.VK_UP => KeyboardKey.ArrowUp, + NativeMethods.VK_RIGHT => KeyboardKey.ArrowRight, + NativeMethods.VK_DOWN => KeyboardKey.ArrowDown, + NativeMethods.VK_PRINT => KeyboardKey.PrintScreen, NativeMethods.VK_INSERT => KeyboardKey.Insert, NativeMethods.VK_DELETE => KeyboardKey.Delete, - NativeMethods.VK_HELP => KeyboardKey.Help, NativeMethods.VK_0 => KeyboardKey.D0, NativeMethods.VK_1 => KeyboardKey.D1, NativeMethods.VK_2 => KeyboardKey.D2, @@ -225,9 +173,9 @@ public static class InputUtilities NativeMethods.VK_X => KeyboardKey.X, NativeMethods.VK_Y => KeyboardKey.Y, NativeMethods.VK_Z => KeyboardKey.Z, - NativeMethods.VK_LWIN => KeyboardKey.LWin, - NativeMethods.VK_RWIN => KeyboardKey.RWin, - NativeMethods.VK_APPS => KeyboardKey.Apps, + NativeMethods.VK_LWIN => KeyboardKey.LeftWin, + NativeMethods.VK_RWIN => KeyboardKey.RightWin, + NativeMethods.VK_APPS => KeyboardKey.Application, NativeMethods.VK_SLEEP => KeyboardKey.Sleep, NativeMethods.VK_NUMPAD0 => KeyboardKey.NumPad0, NativeMethods.VK_NUMPAD1 => KeyboardKey.NumPad1, @@ -239,12 +187,12 @@ public static class InputUtilities NativeMethods.VK_NUMPAD7 => KeyboardKey.NumPad7, NativeMethods.VK_NUMPAD8 => KeyboardKey.NumPad8, NativeMethods.VK_NUMPAD9 => KeyboardKey.NumPad9, - NativeMethods.VK_MULTIPLY => KeyboardKey.Multiply, - NativeMethods.VK_ADD => KeyboardKey.Add, - NativeMethods.VK_SEPARATOR => KeyboardKey.Separator, - NativeMethods.VK_SUBTRACT => KeyboardKey.Subtract, - NativeMethods.VK_DECIMAL => KeyboardKey.Decimal, - NativeMethods.VK_DIVIDE => KeyboardKey.Divide, + NativeMethods.VK_MULTIPLY => KeyboardKey.NumPadMultiply, + NativeMethods.VK_ADD => KeyboardKey.NumPadAdd, + NativeMethods.VK_SEPARATOR => KeyboardKey.NumPadSeparator, + NativeMethods.VK_SUBTRACT => KeyboardKey.NumPadSubtract, + NativeMethods.VK_DECIMAL => KeyboardKey.NumPadDecimal, + NativeMethods.VK_DIVIDE => KeyboardKey.NumPadDivide, NativeMethods.VK_F1 => KeyboardKey.F1, NativeMethods.VK_F2 => KeyboardKey.F2, NativeMethods.VK_F3 => KeyboardKey.F3, @@ -270,7 +218,7 @@ public static class InputUtilities NativeMethods.VK_F23 => KeyboardKey.F23, NativeMethods.VK_F24 => KeyboardKey.F24, NativeMethods.VK_NUMLOCK => KeyboardKey.NumLock, - NativeMethods.VK_SCROLL => KeyboardKey.Scroll, + NativeMethods.VK_SCROLL => KeyboardKey.ScrollLock, NativeMethods.VK_SHIFT => KeyboardKey.LeftShift, NativeMethods.VK_LSHIFT => KeyboardKey.LeftShift, NativeMethods.VK_RSHIFT => KeyboardKey.RightShift, @@ -296,8 +244,8 @@ public static class InputUtilities NativeMethods.VK_MEDIA_PLAY_PAUSE => KeyboardKey.MediaPlayPause, NativeMethods.VK_LAUNCH_MAIL => KeyboardKey.LaunchMail, NativeMethods.VK_LAUNCH_MEDIA_SELECT => KeyboardKey.SelectMedia, - NativeMethods.VK_LAUNCH_APP1 => KeyboardKey.LaunchApplication1, - NativeMethods.VK_LAUNCH_APP2 => KeyboardKey.LaunchApplication2, + NativeMethods.VK_LAUNCH_APP1 => KeyboardKey.FileBrowser, + NativeMethods.VK_LAUNCH_APP2 => KeyboardKey.Calculator, NativeMethods.VK_OEM_1 => KeyboardKey.OemSemicolon, NativeMethods.VK_OEM_PLUS => KeyboardKey.OemPlus, NativeMethods.VK_OEM_COMMA => KeyboardKey.OemComma, @@ -310,22 +258,6 @@ public static class InputUtilities NativeMethods.VK_OEM_6 => KeyboardKey.OemCloseBrackets, NativeMethods.VK_OEM_7 => KeyboardKey.OemQuotes, NativeMethods.VK_OEM_102 => KeyboardKey.OemBackslash, - NativeMethods.VK_PROCESSKEY => KeyboardKey.ImeProcessed, - NativeMethods.VK_OEM_ATTN => KeyboardKey.Attn, - NativeMethods.VK_OEM_FINISH => KeyboardKey.OemFinish, - NativeMethods.VK_OEM_COPY => KeyboardKey.OemCopy, - NativeMethods.VK_OEM_AUTO => KeyboardKey.OemAuto, - NativeMethods.VK_OEM_ENLW => KeyboardKey.OemEnlw, - NativeMethods.VK_OEM_BACKTAB => KeyboardKey.OemBackTab, - NativeMethods.VK_ATTN => KeyboardKey.Attn, - NativeMethods.VK_CRSEL => KeyboardKey.CrSel, - NativeMethods.VK_EXSEL => KeyboardKey.ExSel, - NativeMethods.VK_EREOF => KeyboardKey.EraseEof, - NativeMethods.VK_PLAY => KeyboardKey.Play, - NativeMethods.VK_ZOOM => KeyboardKey.Zoom, - NativeMethods.VK_NONAME => KeyboardKey.NoName, - NativeMethods.VK_PA1 => KeyboardKey.Pa1, - NativeMethods.VK_OEM_CLEAR => KeyboardKey.OemClear, _ => KeyboardKey.None }; } @@ -337,35 +269,25 @@ public static class InputUtilities { return key switch { - KeyboardKey.Cancel => NativeMethods.VK_CANCEL, - KeyboardKey.Back => NativeMethods.VK_BACK, + KeyboardKey.Backspace => NativeMethods.VK_BACK, KeyboardKey.Tab => NativeMethods.VK_TAB, KeyboardKey.Clear => NativeMethods.VK_CLEAR, - KeyboardKey.Return => NativeMethods.VK_RETURN, - KeyboardKey.Pause => NativeMethods.VK_PAUSE, + KeyboardKey.Enter => NativeMethods.VK_RETURN, + KeyboardKey.PauseBreak => NativeMethods.VK_PAUSE, KeyboardKey.CapsLock => NativeMethods.VK_CAPITAL, - KeyboardKey.JunjaMode => NativeMethods.VK_JUNJA, - KeyboardKey.FinalMode => NativeMethods.VK_FINAL, KeyboardKey.Escape => NativeMethods.VK_ESCAPE, - KeyboardKey.ImeConvert => NativeMethods.VK_CONVERT, - KeyboardKey.ImeNonConvert => NativeMethods.VK_NONCONVERT, - KeyboardKey.ImeAccept => NativeMethods.VK_ACCEPT, - KeyboardKey.ImeModeChange => NativeMethods.VK_MODECHANGE, KeyboardKey.Space => NativeMethods.VK_SPACE, - KeyboardKey.Prior => NativeMethods.VK_PRIOR, - KeyboardKey.Next => NativeMethods.VK_NEXT, + KeyboardKey.PageUp => NativeMethods.VK_PRIOR, + KeyboardKey.PageDown => NativeMethods.VK_NEXT, KeyboardKey.End => NativeMethods.VK_END, KeyboardKey.Home => NativeMethods.VK_HOME, - KeyboardKey.Left => NativeMethods.VK_LEFT, - KeyboardKey.Up => NativeMethods.VK_UP, - KeyboardKey.Right => NativeMethods.VK_RIGHT, - KeyboardKey.Down => NativeMethods.VK_DOWN, - KeyboardKey.Select => NativeMethods.VK_SELECT, - KeyboardKey.Print => NativeMethods.VK_PRINT, - KeyboardKey.Execute => NativeMethods.VK_EXECUTE, + KeyboardKey.ArrowLeft => NativeMethods.VK_LEFT, + KeyboardKey.ArrowUp => NativeMethods.VK_UP, + KeyboardKey.ArrowRight => NativeMethods.VK_RIGHT, + KeyboardKey.ArrowDown => NativeMethods.VK_DOWN, + KeyboardKey.PrintScreen => NativeMethods.VK_PRINT, KeyboardKey.Insert => NativeMethods.VK_INSERT, KeyboardKey.Delete => NativeMethods.VK_DELETE, - KeyboardKey.Help => NativeMethods.VK_HELP, KeyboardKey.D0 => NativeMethods.VK_0, KeyboardKey.D1 => NativeMethods.VK_1, KeyboardKey.D2 => NativeMethods.VK_2, @@ -402,9 +324,9 @@ public static class InputUtilities KeyboardKey.X => NativeMethods.VK_X, KeyboardKey.Y => NativeMethods.VK_Y, KeyboardKey.Z => NativeMethods.VK_Z, - KeyboardKey.LWin => NativeMethods.VK_LWIN, - KeyboardKey.RWin => NativeMethods.VK_RWIN, - KeyboardKey.Apps => NativeMethods.VK_APPS, + KeyboardKey.LeftWin => NativeMethods.VK_LWIN, + KeyboardKey.RightWin => NativeMethods.VK_RWIN, + KeyboardKey.Application => NativeMethods.VK_APPS, KeyboardKey.Sleep => NativeMethods.VK_SLEEP, KeyboardKey.NumPad0 => NativeMethods.VK_NUMPAD0, KeyboardKey.NumPad1 => NativeMethods.VK_NUMPAD1, @@ -416,12 +338,12 @@ public static class InputUtilities KeyboardKey.NumPad7 => NativeMethods.VK_NUMPAD7, KeyboardKey.NumPad8 => NativeMethods.VK_NUMPAD8, KeyboardKey.NumPad9 => NativeMethods.VK_NUMPAD9, - KeyboardKey.Multiply => NativeMethods.VK_MULTIPLY, - KeyboardKey.Add => NativeMethods.VK_ADD, - KeyboardKey.Separator => NativeMethods.VK_SEPARATOR, - KeyboardKey.Subtract => NativeMethods.VK_SUBTRACT, - KeyboardKey.Decimal => NativeMethods.VK_DECIMAL, - KeyboardKey.Divide => NativeMethods.VK_DIVIDE, + KeyboardKey.NumPadMultiply => NativeMethods.VK_MULTIPLY, + KeyboardKey.NumPadAdd => NativeMethods.VK_ADD, + KeyboardKey.NumPadSeparator => NativeMethods.VK_SEPARATOR, + KeyboardKey.NumPadSubtract => NativeMethods.VK_SUBTRACT, + KeyboardKey.NumPadDecimal => NativeMethods.VK_DECIMAL, + KeyboardKey.NumPadDivide => NativeMethods.VK_DIVIDE, KeyboardKey.F1 => NativeMethods.VK_F1, KeyboardKey.F2 => NativeMethods.VK_F2, KeyboardKey.F3 => NativeMethods.VK_F3, @@ -447,7 +369,7 @@ public static class InputUtilities KeyboardKey.F23 => NativeMethods.VK_F23, KeyboardKey.F24 => NativeMethods.VK_F24, KeyboardKey.NumLock => NativeMethods.VK_NUMLOCK, - KeyboardKey.Scroll => NativeMethods.VK_SCROLL, + KeyboardKey.ScrollLock => NativeMethods.VK_SCROLL, KeyboardKey.LeftShift => NativeMethods.VK_LSHIFT, KeyboardKey.RightShift => NativeMethods.VK_RSHIFT, KeyboardKey.LeftCtrl => NativeMethods.VK_LCONTROL, @@ -470,8 +392,8 @@ public static class InputUtilities KeyboardKey.MediaPlayPause => NativeMethods.VK_MEDIA_PLAY_PAUSE, KeyboardKey.LaunchMail => NativeMethods.VK_LAUNCH_MAIL, KeyboardKey.SelectMedia => NativeMethods.VK_LAUNCH_MEDIA_SELECT, - KeyboardKey.LaunchApplication1 => NativeMethods.VK_LAUNCH_APP1, - KeyboardKey.LaunchApplication2 => NativeMethods.VK_LAUNCH_APP2, + KeyboardKey.FileBrowser => NativeMethods.VK_LAUNCH_APP1, + KeyboardKey.Calculator => NativeMethods.VK_LAUNCH_APP2, KeyboardKey.OemSemicolon => NativeMethods.VK_OEM_1, KeyboardKey.OemPlus => NativeMethods.VK_OEM_PLUS, KeyboardKey.OemComma => NativeMethods.VK_OEM_COMMA, @@ -484,29 +406,12 @@ public static class InputUtilities KeyboardKey.OemCloseBrackets => NativeMethods.VK_OEM_6, KeyboardKey.OemQuotes => NativeMethods.VK_OEM_7, KeyboardKey.OemBackslash => NativeMethods.VK_OEM_102, - KeyboardKey.ImeProcessed => NativeMethods.VK_PROCESSKEY, - KeyboardKey.OemAttn => NativeMethods.VK_ATTN, - KeyboardKey.OemFinish => NativeMethods.VK_OEM_FINISH, - KeyboardKey.OemCopy => NativeMethods.VK_OEM_COPY, - KeyboardKey.OemAuto => NativeMethods.VK_OEM_AUTO, - KeyboardKey.OemEnlw => NativeMethods.VK_OEM_ENLW, - KeyboardKey.OemBackTab => NativeMethods.VK_OEM_BACKTAB, - KeyboardKey.Attn => NativeMethods.VK_ATTN, - KeyboardKey.CrSel => NativeMethods.VK_CRSEL, - KeyboardKey.ExSel => NativeMethods.VK_EXSEL, - KeyboardKey.EraseEof => NativeMethods.VK_EREOF, - KeyboardKey.Play => NativeMethods.VK_PLAY, - KeyboardKey.Zoom => NativeMethods.VK_ZOOM, - KeyboardKey.NoName => NativeMethods.VK_NONAME, - KeyboardKey.Pa1 => NativeMethods.VK_PA1, - KeyboardKey.OemClear => NativeMethods.VK_OEM_CLEAR, - KeyboardKey.DeadCharProcessed => 0, _ => 0 }; } /// - /// Convert a scan code to a key, following US keyboard layout. + /// Convert a scan code to our Key enum, following US keyboard layout. /// This is useful because we don't care about the keyboard layout, just the key location for effects. /// public static KeyboardKey KeyFromScanCode(uint scanCode) @@ -526,7 +431,7 @@ public static class InputUtilities 11 => KeyboardKey.D0, 12 => KeyboardKey.OemMinus, 13 => KeyboardKey.OemPlus, - 14 => KeyboardKey.Back, + 14 => KeyboardKey.Backspace, 15 => KeyboardKey.Tab, 16 => KeyboardKey.Q, 17 => KeyboardKey.W, @@ -577,14 +482,14 @@ public static class InputUtilities 67 => KeyboardKey.F9, 68 => KeyboardKey.F10, 69 => KeyboardKey.NumLock, - 70 => KeyboardKey.Scroll, + 70 => KeyboardKey.ScrollLock, 74 => KeyboardKey.NumPadSubtract, 78 => KeyboardKey.NumPadAdd, - 86 => KeyboardKey.OemBackslash, //On iso, it's the key between left shift and Z + 86 => KeyboardKey.OemBackslash, 87 => KeyboardKey.F11, 88 => KeyboardKey.F12, - 91 => KeyboardKey.LWin, - 92 => KeyboardKey.RWin, + 91 => KeyboardKey.LeftWin, + 92 => KeyboardKey.RightWin, //28 = enter or numpad enter //29 = left ctrl or right ctrl diff --git a/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs b/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs index a2cbf9e18..355c4a117 100644 --- a/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs +++ b/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs @@ -68,7 +68,7 @@ public class InputMappingsTabViewModel : ActivatableViewModelBase return; // Locate the original LED the same way the InputService did it, but supply false to Device.GetLed - bool foundLedId = InputKeyUtilities.KeyboardKeyLedIdMap.TryGetValue(e.Key, out LedId ledId); + bool foundLedId = InputKeyUtilities.TryGetLedIdFromKeyboardKey(e.Key, out LedId ledId); if (!foundLedId) return; ArtemisLed? artemisLed = Device.GetLed(ledId, false);