diff --git a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs
index 75abc7db2..d58ae8f02 100644
--- a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs
+++ b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs
@@ -4,533 +4,419 @@
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
+ NumPad9,
+
+ /// The NumPad enter key
+ 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,
+
+ /// The NumPad separator key (lower half of the "Add" key on some keyboards)
+ NumPadSeparator,
/// The F1 key.
- F1 = 90, // 0x0000005A
+ F1,
/// The F2 key.
- F2 = 91, // 0x0000005B
+ F2,
/// The F3 key.
- F3 = 92, // 0x0000005C
+ F3,
/// The F4 key.
- F4 = 93, // 0x0000005D
+ F4,
/// The F5 key.
- F5 = 94, // 0x0000005E
+ F5,
/// The F6 key.
- F6 = 95, // 0x0000005F
+ F6,
/// The F7 key.
- F7 = 96, // 0x00000060
+ F7,
/// The F8 key.
- F8 = 97, // 0x00000061
+ F8,
/// The F9 key.
- F9 = 98, // 0x00000062
+ F9,
/// The F10 key.
- F10 = 99, // 0x00000063
+ F10,
/// The F11 key.
- F11 = 100, // 0x00000064
+ F11,
/// The F12 key.
- F12 = 101, // 0x00000065
+ F12,
/// The F13 key.
- F13 = 102, // 0x00000066
+ F13,
/// The F14 key.
- F14 = 103, // 0x00000067
+ F14,
/// The F15 key.
- F15 = 104, // 0x00000068
+ F15,
/// The F16 key.
- F16 = 105, // 0x00000069
+ F16,
/// The F17 key.
- F17 = 106, // 0x0000006A
+ F17,
/// The F18 key.
- F18 = 107, // 0x0000006B
+ F18,
/// The F19 key.
- F19 = 108, // 0x0000006C
+ F19,
/// The F20 key.
- F20 = 109, // 0x0000006D
+ F20,
/// The F21 key.
- F21 = 110, // 0x0000006E
+ F21,
/// The F22 key.
- F22 = 111, // 0x0000006F
+ F22,
/// The F23 key.
- F23 = 112, // 0x00000070
+ F23,
/// The F24 key.
- F24 = 113, // 0x00000071
-
- /// The Num Lock key.
- NumLock = 114, // 0x00000072
+ F24,
/// The Scroll Lock key.
- Scroll = 115, // 0x00000073
+ ScrollLock,
/// The left Shift key.
- LeftShift = 116, // 0x00000074
+ LeftShift,
/// The right Shift key.
- RightShift = 117, // 0x00000075
+ RightShift,
/// The left CTRL key.
- LeftCtrl = 118, // 0x00000076
+ LeftCtrl,
/// The right CTRL key.
- RightCtrl = 119, // 0x00000077
+ RightCtrl,
/// The left ALT key.
- LeftAlt = 120, // 0x00000078
+ LeftAlt,
/// The right ALT key.
- RightAlt = 121, // 0x00000079
+ RightAlt,
/// The Browser Back key.
- BrowserBack = 122, // 0x0000007A
+ BrowserBack,
/// The Browser Forward key.
- BrowserForward = 123, // 0x0000007B
+ BrowserForward,
/// The Browser Refresh key.
- BrowserRefresh = 124, // 0x0000007C
+ BrowserRefresh,
/// The Browser Stop key.
- BrowserStop = 125, // 0x0000007D
+ BrowserStop,
/// The Browser Search key.
- BrowserSearch = 126, // 0x0000007E
+ BrowserSearch,
/// The Browser Favorites key.
- BrowserFavorites = 127, // 0x0000007F
+ BrowserFavorites,
/// The Browser Home key.
- BrowserHome = 128, // 0x00000080
+ BrowserHome,
/// The Volume Mute key.
- VolumeMute = 129, // 0x00000081
+ VolumeMute,
/// The Volume Down key.
- VolumeDown = 130, // 0x00000082
+ VolumeDown,
/// The Volume Up key.
- VolumeUp = 131, // 0x00000083
+ VolumeUp,
/// The Media Next Track key.
- MediaNextTrack = 132, // 0x00000084
+ MediaNextTrack,
/// The Media Previous Track key.
- MediaPreviousTrack = 133, // 0x00000085
+ MediaPreviousTrack,
/// The Media Stop key.
- MediaStop = 134, // 0x00000086
+ MediaStop,
/// The Media Play Pause key.
- MediaPlayPause = 135, // 0x00000087
+ MediaPlayPause,
/// The Launch Mail key.
- LaunchMail = 136, // 0x00000088
+ LaunchMail,
/// The Select Media key.
- SelectMedia = 137, // 0x00000089
+ SelectMedia,
/// The Launch Application1 key.
- LaunchApplication1 = 138, // 0x0000008A
+ FileBrowser,
/// The Launch Application2 key.
- LaunchApplication2 = 139, // 0x0000008B
+ Calculator,
- /// The OEM Semicolon key.
- OemSemicolon = 140, // 0x0000008C
+ /// The Semicolon key.
+ OemSemicolon,
- /// The OEM Addition key.
- OemPlus = 141, // 0x0000008D
+ /// The Addition key.
+ OemPlus,
- /// The OEM Comma key.
- OemComma = 142, // 0x0000008E
+ /// The Comma key.
+ OemComma,
- /// The OEM Minus key.
- OemMinus = 143, // 0x0000008F
+ /// The Minus key.
+ OemMinus,
- /// The OEM Period key.
- OemPeriod = 144, // 0x00000091
+ /// The Period key.
+ OemPeriod,
- /// 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 Question key.
+ OemQuestion,
+ /// The Tilde key.
+ OemTilde,
+
/// The OEM Open Brackets key.
- OemOpenBrackets = 149, // 0x00000096
-
- /// The OEM Pipe key.
- OemPipe = 150, // 0x00000096
+ OemOpenBrackets,
/// The OEM Close Brackets key.
- OemCloseBrackets = 151, // 0x00000097
-
+ OemCloseBrackets,
+
+ /// The OEM Pipe key. The backslash key next to enter.
+ OemPipe,
+
/// The OEM Quotes key.
- OemQuotes = 152, // 0x00000098
+ OemQuotes,
- /// 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,
-
- /// The NumPad enter key
- NumPadEnter
+ /// 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 d04f217dc..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,194 +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_Custom42}, // unverified
- {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}
- };
-
+ 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 48ae607f6..a7502c6ef 100644
--- a/src/Artemis.Core/Services/Input/InputService.cs
+++ b/src/Artemis.Core/Services/Input/InputService.cs
@@ -268,7 +268,14 @@ 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)
+ {
+ ledId = LedId.Keyboard_NonUsTilde;
+ }
+
ArtemisLed? led = null;
if (foundLedId && e.Device != null)
led = e.Device.GetLed(ledId, true);
@@ -348,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;
@@ -387,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/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs
index 997c19ef3..e580f5fdf 100644
--- a/src/Artemis.UI.Linux/ApplicationStateManager.cs
+++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs
@@ -29,6 +29,7 @@ public class ApplicationStateManager
Core.Utilities.ShutdownRequested += UtilitiesOnShutdownRequested;
Core.Utilities.RestartRequested += UtilitiesOnRestartRequested;
+ Core.Utilities.UpdateRequested += UtilitiesOnUpdateRequested;
// On OS shutdown dispose the IOC container just so device providers get a chance to clean up
if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime)
@@ -138,4 +139,35 @@ public class ApplicationStateManager
//todo
}
+
+ private void UtilitiesOnUpdateRequested(object? sender, UpdateEventArgs e)
+ {
+ List argsList = new(StartupArguments);
+ if (e.Silent && !argsList.Contains("--minimized"))
+ argsList.Add("--minimized");
+
+ // Retain startup arguments after update by providing them to the script
+ string script = Path.Combine(Constants.UpdatingFolder, "installing", "Scripts", "update.sh");
+ string source = $"\"{Path.Combine(Constants.UpdatingFolder, "installing")}\"";
+ string destination = $"\"{Constants.ApplicationFolder}\"";
+ string args = argsList.Any() ? string.Join(' ', argsList) : "";
+
+ RunScriptWithOutputFile(script, $"{source} {destination} {args}", Path.Combine(Constants.DataFolder, "update-log.txt"));
+
+ // Lets try a graceful shutdown, the script will kill if needed
+ if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime)
+ Dispatcher.UIThread.Post(() => controlledApplicationLifetime.Shutdown());
+ }
+
+ private static void RunScriptWithOutputFile(string script, string arguments, string outputFile)
+ {
+ ProcessStartInfo info = new()
+ {
+ Arguments = $"\"{script}\" {arguments} > \"{outputFile}\"",
+ FileName = "/bin/bash",
+ WindowStyle = ProcessWindowStyle.Hidden,
+ CreateNoWindow = true,
+ };
+ Process.Start(info);
+ }
}
\ No newline at end of file
diff --git a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj
index fb6d0c80e..210637896 100644
--- a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj
+++ b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj
@@ -27,4 +27,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png b/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png
new file mode 100644
index 000000000..01b8149d5
Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png differ
diff --git a/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png b/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png
new file mode 100644
index 000000000..00d10d10d
Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png differ
diff --git a/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png b/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png
new file mode 100644
index 000000000..22bc95aa3
Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png differ
diff --git a/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png b/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png
new file mode 100644
index 000000000..6434edb8e
Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png differ
diff --git a/src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png b/src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png
new file mode 100644
index 000000000..b20509d12
Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png differ
diff --git a/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png b/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png
new file mode 100644
index 000000000..bc81ba290
Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png differ
diff --git a/src/Artemis.UI.Linux/Scripts/update.sh b/src/Artemis.UI.Linux/Scripts/update.sh
new file mode 100644
index 000000000..9ee398d2c
--- /dev/null
+++ b/src/Artemis.UI.Linux/Scripts/update.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+sourceDirectory=$1
+destinationDirectory=$2
+artemisArgs=$3
+
+# Wait for up to 10 seconds for the Artemis process to exit
+i=0
+while [ $i -le 10 ]
+do
+ if ! pgrep -x "Artemis.UI.Linux" > /dev/null
+ then
+ break
+ fi
+ sleep 1
+ i=$((i+1))
+done
+
+# If the Artemis process is still running, kill it
+if pgrep -x "Artemis.UI.Linux" > /dev/null
+then
+ pkill -x "Artemis.UI.Linux"
+fi
+
+# Check if the destination directory exists
+if [ ! -d "$destinationDirectory" ]
+then
+ echo "Destination directory does not exist"
+ exit 1
+fi
+
+# Clear the destination directory but don't remove it
+echo "Cleaning up old version where needed"
+rm -rf "${destinationDirectory:?}/"*
+
+# Move the contents of the source directory to the destination directory
+echo "Installing new files"
+mv "$sourceDirectory"/* "$destinationDirectory"
+
+# Remove the now empty source directory
+rmdir "$sourceDirectory"
+
+# Ensure the executable is executable
+chmod +x "$destinationDirectory/Artemis.UI.Linux"
+
+echo "Finished! Restarting Artemis"
+sleep 1
+
+# When finished, start Artemis again
+
+# quoting here breaks stuff, all arguments count as 1
+# shellcheck disable=SC2086
+"$destinationDirectory/Artemis.UI.Linux" $artemisArgs &
+
+
+
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 b34201da2..40f51d132 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;
@@ -114,17 +114,21 @@ public class WindowsInputProvider : InputProvider
private void HandleKeyboardData(RawInputData data, RawInputKeyboardData keyboardData)
{
- KeyboardKey key = InputUtilities.KeyFromVirtualKey(keyboardData.Keyboard.VirutalKey);
+ KeyboardKey key = KeyboardKey.None;
+ try
+ {
+ key = InputUtilities.CorrectVirtualKeyAndScanCode(keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags);
+ }
+ catch (Exception e)
+ {
+ _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}");
- // 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
@@ -142,23 +146,7 @@ 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);
+ bool isDown = (keyboardData.Keyboard.Flags & RawKeyboardFlags.Up) == 0;
OnKeyboardDataReceived(device, key, isDown);
UpdateToggleStatus();
@@ -169,7 +157,7 @@ public class WindowsInputProvider : InputProvider
OnKeyboardToggleStatusReceived(new KeyboardToggleStatus(
InputUtilities.IsKeyToggled(KeyboardKey.NumLock),
InputUtilities.IsKeyToggled(KeyboardKey.CapsLock),
- InputUtilities.IsKeyToggled(KeyboardKey.Scroll)
+ InputUtilities.IsKeyToggled(KeyboardKey.ScrollLock)
));
}
@@ -227,39 +215,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 f18ff88cc..663ec341e 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,9 +12,80 @@ namespace Artemis.UI.Windows.Utilities;
///
public static class InputUtilities
{
- public static bool IsKeyDown(KeyboardKey key)
+ [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
+ private static extern short GetKeyState(int keyCode);
+
+ [Flags]
+ private enum KeyStates
{
- return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
+ None = 0,
+ Down = 1,
+ Toggled = 2
+ }
+
+ 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(int virtualKey, int scanCode, uint flags)
+ {
+ KeystrokeInfo info = new()
+ {
+ ScanCode = scanCode,
+ VirtualKey = virtualKey,
+ IsE0 = (flags & 2) != 0,
+ 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
+ { 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.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,
+ { 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.ArrowUp,
+ { ScanCode: 72, IsE0: false } => KeyboardKey.NumPad8,
+ { ScanCode: 73, IsE0: true } => KeyboardKey.PageUp,
+ { ScanCode: 73, IsE0: false } => KeyboardKey.NumPad9,
+ { 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.ArrowRight,
+ { ScanCode: 77, IsE0: false } => KeyboardKey.NumPad6,
+ { ScanCode: 79, IsE0: true } => KeyboardKey.End,
+ { ScanCode: 79, IsE0: false } => KeyboardKey.NumPad1,
+ { ScanCode: 80, IsE0: true } => KeyboardKey.ArrowDown,
+ { 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 IsKeyToggled(KeyboardKey key)
@@ -21,1355 +93,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 +111,400 @@ 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_BACK => KeyboardKey.Backspace,
+ NativeMethods.VK_TAB => KeyboardKey.Tab,
+ NativeMethods.VK_CLEAR => KeyboardKey.Clear,
+ NativeMethods.VK_RETURN => KeyboardKey.Enter,
+ NativeMethods.VK_PAUSE => KeyboardKey.PauseBreak,
+ NativeMethods.VK_CAPSLOCK => KeyboardKey.CapsLock,
+ NativeMethods.VK_ESCAPE => KeyboardKey.Escape,
+ 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.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_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.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,
+ 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.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,
+ 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.ScrollLock,
+ 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.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,
+ 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,
+ _ => KeyboardKey.None
+ };
+ }
+
+ ///
+ /// Convert our Key enum into a Win32 VirtualKeyboardKey.
+ ///
+ public static int VirtualKeyFromKey(KeyboardKey key)
+ {
+ return key switch
+ {
+ KeyboardKey.Backspace => NativeMethods.VK_BACK,
+ KeyboardKey.Tab => NativeMethods.VK_TAB,
+ KeyboardKey.Clear => NativeMethods.VK_CLEAR,
+ KeyboardKey.Enter => NativeMethods.VK_RETURN,
+ KeyboardKey.PauseBreak => NativeMethods.VK_PAUSE,
+ KeyboardKey.CapsLock => NativeMethods.VK_CAPITAL,
+ KeyboardKey.Escape => NativeMethods.VK_ESCAPE,
+ KeyboardKey.Space => NativeMethods.VK_SPACE,
+ KeyboardKey.PageUp => NativeMethods.VK_PRIOR,
+ KeyboardKey.PageDown => NativeMethods.VK_NEXT,
+ KeyboardKey.End => NativeMethods.VK_END,
+ KeyboardKey.Home => NativeMethods.VK_HOME,
+ 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.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.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,
+ 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.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,
+ 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.ScrollLock => 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.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,
+ 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,
+ _ => 0
+ };
+ }
+
+ ///
+ /// 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)
+ {
+ return scanCode switch
+ {
+ 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.Backspace,
+ 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.ScrollLock,
+ 74 => KeyboardKey.NumPadSubtract,
+ 78 => KeyboardKey.NumPadAdd,
+ 86 => KeyboardKey.OemBackslash,
+ 87 => KeyboardKey.F11,
+ 88 => KeyboardKey.F12,
+ 91 => KeyboardKey.LeftWin,
+ 92 => KeyboardKey.RightWin,
+
+ //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
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);