From 73294655734acdc974837f3a09e23557b665a5f6 Mon Sep 17 00:00:00 2001
From: goat <16760685+goaaats@users.noreply.github.com>
Date: Tue, 14 Dec 2021 21:23:21 +0100
Subject: [PATCH] feat: add VirtualKey.GetFancyName()
---
Dalamud/Game/ClientState/Keys/VirtualKey.cs | 211 +++++++++++++++++-
.../ClientState/Keys/VirtualKeyAttribute.cs | 25 +++
.../ClientState/Keys/VirtualKeyExtensions.cs | 20 ++
3 files changed, 252 insertions(+), 4 deletions(-)
create mode 100644 Dalamud/Game/ClientState/Keys/VirtualKeyAttribute.cs
create mode 100644 Dalamud/Game/ClientState/Keys/VirtualKeyExtensions.cs
diff --git a/Dalamud/Game/ClientState/Keys/VirtualKey.cs b/Dalamud/Game/ClientState/Keys/VirtualKey.cs
index ab9436822..dd9009601 100644
--- a/Dalamud/Game/ClientState/Keys/VirtualKey.cs
+++ b/Dalamud/Game/ClientState/Keys/VirtualKey.cs
@@ -11,21 +11,25 @@ namespace Dalamud.Game.ClientState.Keys
///
/// This is an addendum to use on functions in which you have to pass a zero value to represent no key code.
///
+ [VirtualKey("No key")]
NO_KEY = 0,
///
/// Left mouse button.
///
+ [VirtualKey("Left mouse button")]
LBUTTON = 1,
///
/// Right mouse button.
///
+ [VirtualKey("Right mouse button")]
RBUTTON = 2,
///
/// Control-break processing.
///
+ [VirtualKey("CANCEL")]
CANCEL = 3,
///
@@ -34,770 +38,925 @@ namespace Dalamud.Game.ClientState.Keys
///
/// NOT contiguous with L and R buttons.
///
+ [VirtualKey("Mouse 3")]
MBUTTON = 4,
///
/// X1 mouse button.
///
+
///
/// NOT contiguous with L and R buttons.
///
+ [VirtualKey("Mouse 4")]
XBUTTON1 = 5,
///
/// X2 mouse button.
///
+
///
/// NOT contiguous with L and R buttons.
///
+ [VirtualKey("Mouse 5")]
XBUTTON2 = 6,
///
/// BACKSPACE key.
///
+ [VirtualKey("Backspace")]
BACK = 8,
///
/// TAB key.
///
+ [VirtualKey("Tab")]
TAB = 9,
///
/// CLEAR key.
///
+ [VirtualKey("Clear")]
CLEAR = 12,
///
/// RETURN key.
///
+ [VirtualKey("Return/Enter")]
RETURN = 13,
///
/// SHIFT key.
///
+ [VirtualKey("Shift")]
SHIFT = 16,
///
/// CONTROL key.
///
+ [VirtualKey("Control")]
CONTROL = 17,
///
/// ALT key.
///
+ [VirtualKey("Alt")]
MENU = 18,
///
/// PAUSE key.
///
+ [VirtualKey("Pause")]
PAUSE = 19,
///
/// CAPS LOCK key.
///
+ [VirtualKey("Caps Lock")]
CAPITAL = 20,
///
/// IME Kana mode.
///
+ [VirtualKey("Kana Key")]
KANA = 21,
///
- /// IME Hanguel mode (maintained for compatibility; use User32.VirtualKey.HANGUL).
+ /// IME Hangeul mode (maintained for compatibility; use User32.VirtualKey.HANGUL).
///
+ [VirtualKey("Hangul Key")]
HANGEUL = KANA,
///
/// IME Hangul mode.
///
+ [VirtualKey("Hangul Key 2")]
HANGUL = KANA,
///
/// IME Junja mode.
///
+ [VirtualKey("Junja Key")]
JUNJA = 23,
///
/// IME final mode.
///
+ [VirtualKey("Final Key")]
FINAL = 24,
///
/// IME Hanja mode.
///
+ [VirtualKey("Hanja Key")]
HANJA = 25,
///
/// IME Kanji mode.
///
+ [VirtualKey("Kanji Key")]
KANJI = HANJA,
///
/// ESC key.
///
+ [VirtualKey("Escape")]
ESCAPE = 27,
///
/// IME convert.
///
+ [VirtualKey("Convert Key")]
CONVERT = 28,
///
/// IME nonconvert.
///
+ [VirtualKey("Non-Convert Key")]
NONCONVERT = 29,
///
/// IME accept.
///
+ [VirtualKey("IME Accept Key")]
ACCEPT = 30,
///
/// IME mode change request.
///
+ [VirtualKey("IME Mode-Change Key")]
MODECHANGE = 31,
///
/// SPACEBAR.
///
+ [VirtualKey("Spacebar")]
SPACE = 32,
///
/// PAGE UP key.
///
+ [VirtualKey("Page Up")]
PRIOR = 33,
///
/// PAGE DOWN key.
///
+ [VirtualKey("Page Down")]
NEXT = 34,
///
/// END key.
///
+ [VirtualKey("End")]
END = 35,
///
/// HOME key.
///
+ [VirtualKey("Home")]
HOME = 36,
///
/// LEFT ARROW key.
///
+ [VirtualKey("Left Arrow")]
LEFT = 37,
///
/// UP ARROW key.
///
+ [VirtualKey("Up Arrow")]
UP = 38,
///
/// RIGHT ARROW key.
///
+ [VirtualKey("Right Arrow")]
RIGHT = 39,
///
/// DOWN ARROW key.
///
+ [VirtualKey("Down Arrow")]
DOWN = 40,
///
/// SELECT key.
///
+ [VirtualKey("Select")]
SELECT = 41,
///
/// PRINT key.
///
+ [VirtualKey("Print")]
PRINT = 42,
///
/// EXECUTE key.
///
+ [VirtualKey("Execute")]
EXECUTE = 43,
///
/// PRINT SCREEN key.
///
+ [VirtualKey("Print Screen")]
SNAPSHOT = 44,
///
/// INS key.
///
+ [VirtualKey("Insert")]
INSERT = 45,
///
/// DEL key.
///
+ [VirtualKey("Delete")]
DELETE = 46,
///
/// HELP key.
///
+ [VirtualKey("Help")]
HELP = 47,
///
/// 0 key.
///
+ [VirtualKey("Number-Row 0")]
KEY_0 = 48,
///
/// 1 key.
///
+ [VirtualKey("Number-Row 1")]
KEY_1 = 49,
///
/// 2 key.
///
+ [VirtualKey("Number-Row 2")]
KEY_2 = 50,
///
/// 3 key.
///
+ [VirtualKey("Number-Row 3")]
KEY_3 = 51,
///
/// 4 key.
///
+ [VirtualKey("Number-Row 4")]
KEY_4 = 52,
///
/// 5 key.
///
+ [VirtualKey("Number-Row 5")]
KEY_5 = 53,
///
/// 6 key.
///
+ [VirtualKey("Number-Row 6")]
KEY_6 = 54,
///
/// 7 key.
///
+ [VirtualKey("Number-Row 7")]
KEY_7 = 55,
///
/// 8 key.
///
+ [VirtualKey("Number-Row 8")]
KEY_8 = 56,
///
/// 9 key.
///
+ [VirtualKey("Number-Row 9")]
KEY_9 = 57,
///
/// A key.
///
+ [VirtualKey("A")]
A = 65,
///
/// B key.
///
+ [VirtualKey("B")]
B = 66,
///
/// C key.
///
+ [VirtualKey("C")]
C = 67,
///
/// D key.
///
+ [VirtualKey("D")]
D = 68,
///
/// E key.
///
+ [VirtualKey("E")]
E = 69,
///
/// F key.
///
+ [VirtualKey("F")]
F = 70,
///
/// G key.
///
+ [VirtualKey("G")]
G = 71,
///
/// H key.
///
+ [VirtualKey("H")]
H = 72,
///
/// I key.
///
+ [VirtualKey("I")]
I = 73,
///
/// J key.
///
+ [VirtualKey("J")]
J = 74,
///
/// K key.
///
+ [VirtualKey("K")]
K = 75,
///
/// L key.
///
+ [VirtualKey("L")]
L = 76,
///
/// M key.
///
+ [VirtualKey("M")]
M = 77,
///
/// N key.
///
+ [VirtualKey("N")]
N = 78,
///
/// O key.
///
+ [VirtualKey("O")]
O = 79,
///
/// P key.
///
+ [VirtualKey("P")]
P = 80,
///
/// Q key.
///
+ [VirtualKey("Q")]
Q = 81,
///
/// R key.
///
+ [VirtualKey("R")]
R = 82,
///
/// S key.
///
+ [VirtualKey("S")]
S = 83,
///
/// T key.
///
+ [VirtualKey("T")]
T = 84,
///
/// U key.
///
+ [VirtualKey("U")]
U = 85,
///
/// V key.
///
+ [VirtualKey("V")]
V = 86,
///
/// W key.
///
+ [VirtualKey("W")]
W = 87,
///
/// X key.
///
+ [VirtualKey("X")]
X = 88,
///
/// Y key.
///
+ [VirtualKey("Y")]
Y = 89,
///
/// Z key.
///
+ [VirtualKey("Z")]
Z = 90,
///
/// Left Windows key (Natural keyboard).
///
+ [VirtualKey("Left Windows")]
LWIN = 91,
///
/// Right Windows key (Natural keyboard).
///
+ [VirtualKey("Right Windows")]
RWIN = 92,
///
/// Applications key (Natural keyboard).
///
+ [VirtualKey("Applications")]
APPS = 93,
///
/// Computer Sleep key.
///
+ [VirtualKey("Sleep")]
SLEEP = 95,
///
/// Numeric keypad 0 key.
///
+ [VirtualKey("Numpad 0")]
NUMPAD0 = 96,
///
/// Numeric keypad 1 key.
///
+ [VirtualKey("Numpad 1")]
NUMPAD1 = 97,
///
/// Numeric keypad 2 key.
///
+ [VirtualKey("Numpad 2")]
NUMPAD2 = 98,
///
/// Numeric keypad 3 key.
///
+ [VirtualKey("Numpad 3")]
NUMPAD3 = 99,
///
/// Numeric keypad 4 key.
///
+ [VirtualKey("Numpad 4")]
NUMPAD4 = 100,
///
/// Numeric keypad 5 key.
///
+ [VirtualKey("Numpad 5")]
NUMPAD5 = 101,
///
/// Numeric keypad 6 key.
///
+ [VirtualKey("Numpad 6")]
NUMPAD6 = 102,
///
/// Numeric keypad 7 key.
///
+ [VirtualKey("Numpad 7")]
NUMPAD7 = 103,
///
/// Numeric keypad 8 key.
///
+ [VirtualKey("Numpad 8")]
NUMPAD8 = 104,
///
/// Numeric keypad 9 key.
///
+ [VirtualKey("Numpad 9")]
NUMPAD9 = 105,
///
/// Multiply key.
///
+ [VirtualKey("Numpad Multiply")]
MULTIPLY = 106,
///
/// Add key.
///
+ [VirtualKey("Numpad Add")]
ADD = 107,
///
/// Separator key.
///
+ [VirtualKey("Numpad Separator")]
SEPARATOR = 108,
///
/// Subtract key.
///
+ [VirtualKey("Numpad Subtract")]
SUBTRACT = 109,
///
/// Decimal key.
///
+ [VirtualKey("Numpad Decimal")]
DECIMAL = 110,
///
/// Divide key.
///
+ [VirtualKey("Numpad Divide")]
DIVIDE = 111,
///
/// F1 Key.
///
+ [VirtualKey("F1")]
F1 = 112,
///
/// F2 Key.
///
+ [VirtualKey("F2")]
F2 = 113,
///
/// F3 Key.
///
+ [VirtualKey("F3")]
F3 = 114,
///
/// F4 Key.
///
+ [VirtualKey("F4")]
F4 = 115,
///
/// F5 Key.
///
+ [VirtualKey("F5")]
F5 = 116,
///
/// F6 Key.
///
+ [VirtualKey("F6")]
F6 = 117,
///
/// F7 Key.
///
+ [VirtualKey("F7")]
F7 = 118,
///
/// F8 Key.
///
+ [VirtualKey("F8")]
F8 = 119,
///
/// F9 Key.
///
+ [VirtualKey("F9")]
F9 = 120,
///
/// F10 Key.
///
+ [VirtualKey("F10")]
F10 = 121,
///
/// F11 Key.
///
+ [VirtualKey("F11")]
F11 = 122,
///
/// F12 Key.
///
+ [VirtualKey("F12")]
F12 = 123,
///
/// F13 Key.
///
+ [VirtualKey("F13")]
F13 = 124,
///
/// F14 Key.
///
+ [VirtualKey("F14")]
F14 = 125,
///
/// F15 Key.
///
+ [VirtualKey("F15")]
F15 = 126,
///
/// F16 Key.
///
+ [VirtualKey("F16")]
F16 = 127,
///
/// F17 Key.
///
+ [VirtualKey("F17")]
F17 = 128,
///
/// F18 Key.
///
+ [VirtualKey("F18")]
F18 = 129,
///
/// F19 Key.
///
+ [VirtualKey("F19")]
F19 = 130,
///
/// F20 Key.
///
+ [VirtualKey("F20")]
F20 = 131,
///
/// F21 Key.
///
+ [VirtualKey("F21")]
F21 = 132,
///
/// F22 Key.
///
+ [VirtualKey("F22")]
F22 = 133,
///
/// F23 Key.
///
+ [VirtualKey("F23")]
F23 = 134,
///
/// F24 Key.
///
+ [VirtualKey("F24")]
F24 = 135,
///
/// NUM LOCK key.
///
+ [VirtualKey("Num-Lock")]
NUMLOCK = 144,
///
/// SCROLL LOCK key.
///
+ [VirtualKey("Scroll-Lock")]
SCROLL = 145,
///
/// '=' key on numpad (NEC PC-9800 kbd definitions).
///
+ [VirtualKey("Numpad Equals")]
OEM_NEC_EQUAL = 146,
///
/// 'Dictionary' key (Fujitsu/OASYS kbd definitions).
///
+ [VirtualKey("Dictionary (Fujitsu)")]
OEM_FJ_JISHO = OEM_NEC_EQUAL,
///
/// 'Unregister word' key (Fujitsu/OASYS kbd definitions).
///
+ [VirtualKey("Unregister word (Fujitsu)")]
OEM_FJ_MASSHOU = 147,
///
/// 'Register word' key (Fujitsu/OASYS kbd definitions).
///
+ [VirtualKey("Register word (Fujitsu)")]
OEM_FJ_TOUROKU = 148,
///
/// 'Left OYAYUBI' key (Fujitsu/OASYS kbd definitions).
///
+ [VirtualKey("Left Oyayubi (Fujitsu)")]
OEM_FJ_LOYA = 149,
///
/// 'Right OYAYUBI' key (Fujitsu/OASYS kbd definitions).
///
+ [VirtualKey("Right Oyayubi (Fujitsu)")]
OEM_FJ_ROYA = 150,
///
/// Left SHIFT key.
///
///
- /// Used only as parameters to User32.GetAsyncKeyState and User32.GetKeyState. No other API or message will distinguish left and right keys in this way.
+ /// Used only as parameters to User32.GetAsyncKeyState and User32.GetKeyState. No other API or message will distinguish
+ /// left and right keys in this way.
///
+ [VirtualKey("Left Shift")]
LSHIFT = 160,
///
/// Right SHIFT key.
///
+ [VirtualKey("Right Shift")]
RSHIFT = 161,
///
/// Left CONTROL key.
///
+ [VirtualKey("Left Control")]
LCONTROL = 162,
///
/// Right CONTROL key.
///
+ [VirtualKey("Right Control")]
RCONTROL = 163,
///
/// Left MENU key.
///
+ [VirtualKey("Left Menu")]
LMENU = 164,
///
/// Right MENU key.
///
+ [VirtualKey("Right Menu")]
RMENU = 165,
///
/// Browser Back key.
///
+ [VirtualKey("Browser Back")]
BROWSER_BACK = 166,
///
/// Browser Forward key.
///
+ [VirtualKey("Browser Forward")]
BROWSER_FORWARD = 167,
///
/// Browser Refresh key.
///
+ [VirtualKey("Browser Refresh")]
BROWSER_REFRESH = 168,
///
/// Browser Stop key.
///
+ [VirtualKey("Browser Stop")]
BROWSER_STOP = 169,
///
/// Browser Search key.
///
+ [VirtualKey("Browser Search")]
BROWSER_SEARCH = 170,
///
/// Browser Favorites key.
///
+ [VirtualKey("Browser Favorites")]
BROWSER_FAVORITES = 171,
///
/// Browser Start and Home key.
///
+ [VirtualKey("Browser Home")]
BROWSER_HOME = 172,
///
/// Volume Mute key.
///
+ [VirtualKey("Mute Volume")]
VOLUME_MUTE = 173,
///
/// Volume Down key.
///
+ [VirtualKey("Volume Down")]
VOLUME_DOWN = 174,
///
/// Volume Up key.
///
+ [VirtualKey("Volume Up")]
VOLUME_UP = 175,
///
/// Next Track key.
///
+ [VirtualKey("Next Track")]
MEDIA_NEXT_TRACK = 176,
///
/// Previous Track key.
///
+ [VirtualKey("Previous Track")]
MEDIA_PREV_TRACK = 177,
///
/// Stop Media key.
///
+ [VirtualKey("Stop Media")]
MEDIA_STOP = 178,
///
/// Play/Pause Media key.
///
+ [VirtualKey("Play/Pause Media")]
MEDIA_PLAY_PAUSE = 179,
///
/// Start Mail key.
///
+ [VirtualKey("Launch Mail")]
LAUNCH_MAIL = 180,
///
/// Select Media key.
///
+ [VirtualKey("Launch Media Player")]
LAUNCH_MEDIA_SELECT = 181,
///
/// Start Application 1 key.
///
+ [VirtualKey("Launch Application 1")]
LAUNCH_APP1 = 182,
///
/// Start Application 2 key.
///
+ [VirtualKey("Launch Application 2")]
LAUNCH_APP2 = 183,
///
@@ -806,26 +965,31 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the ';:' key.
///
+ [VirtualKey("Semicolon")]
OEM_1 = 186,
///
/// For any country/region, the '+' key.
///
+ [VirtualKey("Plus")]
OEM_PLUS = 187,
///
/// For any country/region, the ',' key.
///
+ [VirtualKey("Comma")]
OEM_COMMA = 188,
///
/// For any country/region, the '-' key.
///
+ [VirtualKey("Minus")]
OEM_MINUS = 189,
///
/// For any country/region, the '.' key.
///
+ [VirtualKey("Period")]
OEM_PERIOD = 190,
///
@@ -834,6 +998,7 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the '/?' key.
///
+ [VirtualKey("Forward Slash/Question Mark")]
OEM_2 = 191,
///
@@ -842,6 +1007,7 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the '`~' key.
///
+ [VirtualKey("Tilde")]
OEM_3 = 192,
///
@@ -850,6 +1016,7 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the '[{' key.
///
+ [VirtualKey("Opening Bracket")]
OEM_4 = 219,
///
@@ -858,6 +1025,7 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the '\|' key.
///
+ [VirtualKey("Back Slash/Pipe")]
OEM_5 = 220,
///
@@ -866,6 +1034,7 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the ']}' key.
///
+ [VirtualKey("Closing Bracket")]
OEM_6 = 221,
///
@@ -874,24 +1043,29 @@ namespace Dalamud.Game.ClientState.Keys
///
/// For the US standard keyboard, the 'single-quote/double-quote' (''"') key.
///
+ [VirtualKey("Single Quote/Double Quote")]
OEM_7 = 222,
///
/// Used for miscellaneous characters; it can vary by keyboard..
///
+ [VirtualKey("OEM 8")]
OEM_8 = 223,
///
/// OEM specific.
///
+
///
/// 'AX' key on Japanese AX kbd.
///
+ [VirtualKey("OEM AX")]
OEM_AX = 225,
///
/// Either the angle bracket ("<>") key or the backslash ("\|") key on the RT 102-key keyboard.
///
+ [VirtualKey("OEM 102")]
OEM_102 = 226,
///
@@ -900,6 +1074,7 @@ namespace Dalamud.Game.ClientState.Keys
///
/// Help key on ICO.
///
+ [VirtualKey("Help (ICO)")]
ICO_HELP = 227,
///
@@ -908,11 +1083,13 @@ namespace Dalamud.Game.ClientState.Keys
///
/// 00 key on ICO.
///
+ [VirtualKey("00 (ICO)")]
ICO_00 = 228,
///
/// IME PROCESS key.
///
+ [VirtualKey("IME Process")]
PROCESSKEY = 229,
///
@@ -921,124 +1098,150 @@ namespace Dalamud.Game.ClientState.Keys
///
/// Clear key on ICO.
///
+ [VirtualKey("Clear (ICO)")]
ICO_CLEAR = 230,
///
- /// Used to pass Unicode characters as if they were keystrokes. The PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods..
+ /// Used to pass Unicode characters as if they were keystrokes. The PACKET key is the low word of a 32-bit Virtual Key
+ /// value used for non-keyboard input methods..
///
///
- /// For more information, see Remark in User32.KEYBDINPUT, User32.SendInput, User32.WindowMessage.WM_KEYDOWN, and User32.WindowMessage.WM_KEYUP.
+ /// For more information, see Remark in User32.KEYBDINPUT, User32.SendInput, User32.WindowMessage.WM_KEYDOWN, and
+ /// User32.WindowMessage.WM_KEYUP.
///
+ [VirtualKey("Packet")]
PACKET = 231,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM Reset")]
OEM_RESET = 233,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM Jump")]
OEM_JUMP = 234,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM PA1")]
OEM_PA1 = 235,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM PA2")]
OEM_PA2 = 236,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM PA3")]
OEM_PA3 = 237,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM WSCTRL")]
OEM_WSCTRL = 238,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM CUSEL")]
OEM_CUSEL = 239,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM ATTN")]
OEM_ATTN = 240,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM Finish")]
OEM_FINISH = 241,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM Copy")]
OEM_COPY = 242,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM Auto")]
OEM_AUTO = 243,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM ENLW")]
OEM_ENLW = 244,
///
/// Nokia/Ericsson definition.
///
+ [VirtualKey("OEM Backtab")]
OEM_BACKTAB = 245,
///
/// Attn key.
///
+ [VirtualKey("ATTN")]
ATTN = 246,
///
/// CrSel key.
///
+ [VirtualKey("CRSEL")]
CRSEL = 247,
///
/// ExSel key.
///
+ [VirtualKey("EXSEL")]
EXSEL = 248,
///
/// Erase EOF key.
///
+ [VirtualKey("Erase EOF")]
EREOF = 249,
///
/// Play key.
///
+ [VirtualKey("Play")]
PLAY = 250,
///
/// Zoom key.
///
+ [VirtualKey("Zoom")]
ZOOM = 251,
///
/// Reserved constant by Windows headers definition.
///
+ [VirtualKey("Reserved")]
NONAME = 252,
///
/// PA1 key.
///
+ [VirtualKey("PA1")]
PA1 = 253,
///
/// Clear key.
///
+ [VirtualKey("Clear")]
OEM_CLEAR = 254,
}
}
diff --git a/Dalamud/Game/ClientState/Keys/VirtualKeyAttribute.cs b/Dalamud/Game/ClientState/Keys/VirtualKeyAttribute.cs
new file mode 100644
index 000000000..249491be7
--- /dev/null
+++ b/Dalamud/Game/ClientState/Keys/VirtualKeyAttribute.cs
@@ -0,0 +1,25 @@
+using System;
+
+namespace Dalamud.Game.ClientState.Keys
+{
+ ///
+ /// Attribute describing a VirtualKey.
+ ///
+ [AttributeUsage(AttributeTargets.Field)]
+ internal sealed class VirtualKeyAttribute : Attribute
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Fancy name of this key.
+ public VirtualKeyAttribute(string fancyName)
+ {
+ this.FancyName = fancyName;
+ }
+
+ ///
+ /// Gets the fancy name of this virtual key.
+ ///
+ public string FancyName { get; init; }
+ }
+}
diff --git a/Dalamud/Game/ClientState/Keys/VirtualKeyExtensions.cs b/Dalamud/Game/ClientState/Keys/VirtualKeyExtensions.cs
new file mode 100644
index 000000000..2a94dd5df
--- /dev/null
+++ b/Dalamud/Game/ClientState/Keys/VirtualKeyExtensions.cs
@@ -0,0 +1,20 @@
+using Dalamud.Utility;
+
+namespace Dalamud.Game.ClientState.Keys
+{
+ ///
+ /// Extension methods for .
+ ///
+ public static class VirtualKeyExtensions
+ {
+ ///
+ /// Get the fancy name associated with this key.
+ ///
+ /// The they key to act on.
+ /// The key's fancy name.
+ public static string GetFancyName(this VirtualKey key)
+ {
+ return key.GetAttribute().FancyName;
+ }
+ }
+}