namespace anjianjingling.Common
{
///
/// 键名 → 虚拟键码(VK)映射。
///
public static class VirtualKeys
{
private static readonly Dictionary Map = new(StringComparer.OrdinalIgnoreCase)
{
["ENTER"] = 0x0D, ["RETURN"] = 0x0D, ["ESC"] = 0x1B, ["ESCAPE"] = 0x1B,
["SPACE"] = 0x20, ["TAB"] = 0x09, ["BACKSPACE"] = 0x08, ["BACK"] = 0x08,
["DELETE"] = 0x2E, ["DEL"] = 0x2E, ["INSERT"] = 0x2D, ["INS"] = 0x2D,
["HOME"] = 0x24, ["END"] = 0x23, ["PAGEUP"] = 0x21, ["PGUP"] = 0x21,
["PAGEDOWN"] = 0x22, ["PGDN"] = 0x22,
["LEFT"] = 0x25, ["UP"] = 0x26, ["RIGHT"] = 0x27, ["DOWN"] = 0x28,
["CAPSLOCK"] = 0x14, ["NUMLOCK"] = 0x90, ["SCROLLLOCK"] = 0x91,
["CTRL"] = 0x11, ["CONTROL"] = 0x11, ["ALT"] = 0x12, ["MENU"] = 0x12,
["SHIFT"] = 0x10, ["WIN"] = 0x5B, ["LWIN"] = 0x5B,
["F1"] = 0x70, ["F2"] = 0x71, ["F3"] = 0x72, ["F4"] = 0x73,
["F5"] = 0x74, ["F6"] = 0x75, ["F7"] = 0x76, ["F8"] = 0x77,
["F9"] = 0x78, ["F10"] = 0x79, ["F11"] = 0x7A, ["F12"] = 0x7B,
["NUMPAD0"] = 0x60, ["NUMPAD1"] = 0x61, ["NUMPAD2"] = 0x62,
["NUMPAD3"] = 0x63, ["NUMPAD4"] = 0x64, ["NUMPAD5"] = 0x65,
["NUMPAD6"] = 0x66, ["NUMPAD7"] = 0x67, ["NUMPAD8"] = 0x68,
["NUMPAD9"] = 0x69,
["MULTIPLY"] = 0x6A, ["ADD"] = 0x6B, ["SUBTRACT"] = 0x6D,
["DECIMAL"] = 0x6E, ["DIVIDE"] = 0x6F,
["OEM_1"] = 0xBA, ["SEMICOLON"] = 0xBA, // ;
["OEM_PLUS"] = 0xBB, ["EQUAL"] = 0xBB, // =
["OEM_COMMA"] = 0xBC, ["COMMA"] = 0xBC, // ,
["OEM_MINUS"] = 0xBD, ["MINUS"] = 0xBD, // -
["OEM_PERIOD"] = 0xBE, ["PERIOD"] = 0xBE, // .
["OEM_2"] = 0xBF, ["SLASH"] = 0xBF, // /
["OEM_3"] = 0xC0, ["BACKQUOTE"] = 0xC0, // `
["OEM_4"] = 0xDB, ["LBRACKET"] = 0xDB, // [
["OEM_5"] = 0xDC, ["BACKSLASH"] = 0xDC, // \
["OEM_6"] = 0xDD, ["RBRACKET"] = 0xDD, // ]
["OEM_7"] = 0xDE, ["QUOTE"] = 0xDE, // '
};
static VirtualKeys()
{
for (char c = 'A'; c <= 'Z'; c++) Map[c.ToString()] = (ushort)c;
for (char c = '0'; c <= '9'; c++) Map[c.ToString()] = (ushort)c;
}
/// 尝试解析键名,返回 VK 码;单字符直接按字符 VK 处理。
public static ushort? Resolve(string name)
{
name = name.Trim();
if (name.Length == 0) return null;
if (Map.TryGetValue(name, out var vk)) return vk;
if (name.Length == 1)
{
char c = char.ToUpperInvariant(name[0]);
if (c >= 'A' && c <= 'Z') return (ushort)c;
if (c >= '0' && c <= '9') return (ushort)c;
}
return null;
}
/// 是否为扩展键(方向键、Insert/Delete 等)。
public static bool IsExtended(ushort vk)
=> vk is >= 0x21 and <= 0x28 or 0x2D or 0x2E or 0x5B or 0x5C or 0x6F or 0x90;
}
}