XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.InputSimulator

【DLL】XFE各类拓展的模拟键盘输入

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEExtension.NetCore.InputSimulator.Native;

internal static class HidKeyMapping
{
    private static readonly Dictionary<ScanCode, byte> Usages = CreateUsages();

    internal static byte GetUsage(ScanCode code) => Usages.TryGetValue(code, out var usage) ? usage
        : throw new ArgumentOutOfRangeException(nameof(code), "驱动只支持 ScanCode 中已命名的键;不接受未知扫描码或 E1 序列。");

    private static Dictionary<ScanCode, byte> CreateUsages()
    {
        Dictionary<ScanCode, byte> keys = new()
        {
            [ScanCode.Enter] = 0x28, [ScanCode.Escape] = 0x29, [ScanCode.Backspace] = 0x2A,
            [ScanCode.Tab] = 0x2B, [ScanCode.Space] = 0x2C, [ScanCode.Minus] = 0x2D,
            [ScanCode.Equals] = 0x2E, [ScanCode.LeftBracket] = 0x2F, [ScanCode.RightBracket] = 0x30,
            [ScanCode.Backslash] = 0x31, [ScanCode.Semicolon] = 0x33, [ScanCode.Quote] = 0x34,
            [ScanCode.Grave] = 0x35, [ScanCode.Comma] = 0x36, [ScanCode.Period] = 0x37,
            [ScanCode.Slash] = 0x38, [ScanCode.CapsLock] = 0x39,
            [ScanCode.PrintScreen] = 0x46, [ScanCode.ScrollLock] = 0x47,
            [ScanCode.Insert] = 0x49, [ScanCode.Home] = 0x4A, [ScanCode.PageUp] = 0x4B,
            [ScanCode.Delete] = 0x4C, [ScanCode.End] = 0x4D, [ScanCode.PageDown] = 0x4E,
            [ScanCode.Right] = 0x4F, [ScanCode.Left] = 0x50, [ScanCode.Down] = 0x51, [ScanCode.Up] = 0x52,
            [ScanCode.NumLock] = 0x53, [ScanCode.NumPadDivide] = 0x54, [ScanCode.NumPadMultiply] = 0x55,
            [ScanCode.NumPadSubtract] = 0x56, [ScanCode.NumPadAdd] = 0x57, [ScanCode.NumPadEnter] = 0x58,
            [ScanCode.NumPad0] = 0x62, [ScanCode.NumPadDecimal] = 0x63,
            [ScanCode.Oem102] = 0x64, [ScanCode.Applications] = 0x65,
            [ScanCode.LeftControl] = 0xE0, [ScanCode.LeftShift] = 0xE1,
            [ScanCode.LeftAlt] = 0xE2, [ScanCode.LeftWindows] = 0xE3,
            [ScanCode.RightControl] = 0xE4, [ScanCode.RightShift] = 0xE5,
            [ScanCode.RightAlt] = 0xE6, [ScanCode.RightWindows] = 0xE7
        };
        for (var letter = 'A'; letter <= 'Z'; letter++) keys[Enum.Parse<ScanCode>(letter.ToString())] = (byte)(4 + letter - 'A');
        for (var digit = 0; digit <= 9; digit++) keys[Enum.Parse<ScanCode>($"D{digit}")] = (byte)(digit == 0 ? 0x27 : 0x1D + digit);
        for (var key = 1; key <= 12; key++) keys[Enum.Parse<ScanCode>($"F{key}")] = (byte)(0x39 + key);
        for (var key = 1; key <= 9; key++) keys[Enum.Parse<ScanCode>($"NumPad{key}")] = (byte)(0x58 + key);
        return keys;
    }
}