67 lines
3.2 KiB
C#
67 lines
3.2 KiB
C#
namespace anjianjingling.Common
|
|
{
|
|
/// <summary>
|
|
/// 键名 → 虚拟键码(VK)映射。
|
|
/// </summary>
|
|
public static class VirtualKeys
|
|
{
|
|
private static readonly Dictionary<string, ushort> 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;
|
|
}
|
|
|
|
/// <summary>尝试解析键名,返回 VK 码;单字符直接按字符 VK 处理。</summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>是否为扩展键(方向键、Insert/Delete 等)。</summary>
|
|
public static bool IsExtended(ushort vk)
|
|
=> vk is >= 0x21 and <= 0x28 or 0x2D or 0x2E or 0x5B or 0x5C or 0x6F or 0x90;
|
|
}
|
|
}
|