using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

internal class SimulateInput
{
    // 定义 INPUT 结构 (用于 SendInput)
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        public uint type;
        public INPUTUNION u;
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct INPUTUNION
    {
        [FieldOffset(0)]
        public MOUSEINPUT mi;
        [FieldOffset(0)]
        public KEYBDINPUT ki;
        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct HARDWAREINPUT
    {
        public uint uMsg;
        public ushort wParamL;
        public ushort wParamH;
    }

    // 常量
    private const uint INPUT_KEYBOARD = 1;
    private const uint KEYEVENTF_KEYUP = 0x0002;
    public const ushort VK_LWIN = 0x5B; // 左 Windows 键
    public const ushort VK_RWIN = 0x5C; // 右 Windows 键
    public const ushort VK_BACKSPACE = 0x08; // 后退
    public const ushort VK_UP = 0x26; // 上
    public const ushort VK_DOWN = 0x28; // 下
    public const ushort VK_NUM0 = 0x30;
    public const ushort VK_NUM1 = 0x31;
    public const ushort VK_NUM2 = 0x32;
    public const ushort VK_NUM3 = 0x33;
    public const ushort VK_NUM4 = 0x34;
    public const ushort VK_NUM5 = 0x35;
    public const ushort VK_NUM6 = 0x36;
    public const ushort VK_NUM7 = 0x37;
    public const ushort VK_NUM8 = 0x38;
    public const ushort VK_NUM9 = 0x39;
    public const ushort VK_DOT = 0xBE;
    // 导入 SendInput 函数
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    public static void SimulateKey(ushort keyCode)
    {
        INPUT input = new INPUT();
        input.type = INPUT_KEYBOARD;
        input.u.ki.wVk = keyCode; // 使用左 Windows 键
        input.u.ki.wScan = 0; // 虚拟键码模式，wScan 可为 0
        input.u.ki.dwFlags = 0; // 按下 (keydown)
        input.u.ki.time = 0;
        input.u.ki.dwExtraInfo = IntPtr.Zero;

        // 发送 "按下" 事件
        SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT)));

        // 可选：短暂延迟 (模拟按键时长)
        // System.Threading.Thread.Sleep(50);

        // 发送 "释放" 事件
        input.u.ki.dwFlags = KEYEVENTF_KEYUP; // 释放 (keyup)
        SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT)));
    }
}

