import ctypes
import sys

user32 = ctypes.windll.user32
shell32 = ctypes.windll.shell32
kernel32 = ctypes.windll.kernel32

is_admin = shell32.IsUserAnAdmin()
print(f"IsUserAnAdmin: {is_admin}")

class KEYBDINPUT(ctypes.Structure):
    _fields_ = [
        ("wVk", ctypes.c_ushort),
        ("wScan", ctypes.c_ushort),
        ("dwFlags", ctypes.c_ulong),
        ("time", ctypes.c_ulong),
        ("dwExtraInfo", ctypes.POINTER(ctypes.c_ulong)),
    ]

class INPUT(ctypes.Structure):
    class _INPUT_UNION(ctypes.Union):
        _fields_ = [("ki", KEYBDINPUT)]
    _anonymous_ = ("_u",)
    _fields_ = [("type", ctypes.c_ulong), ("_u", _INPUT_UNION)]

inp = INPUT()
inp.type = 1 # INPUT_KEYBOARD
inp.ki.wVk = 0x57 # W
inp.ki.wScan = 0x11
inp.ki.dwFlags = 0x0008 # KEYEVENTF_SCANCODE

ret = user32.SendInput(1, ctypes.byref(inp), ctypes.sizeof(INPUT))
err = kernel32.GetLastError()
print(f"SendInput ret: {ret}, GetLastError: {err}")

# Release W
inp.ki.dwFlags = 0x0008 | 0x0002 # KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP
user32.SendInput(1, ctypes.byref(inp), ctypes.sizeof(INPUT))

with open("debug_harness/sendinput_test_result.txt", "w") as f:
    f.write(f"IsUserAnAdmin: {is_admin}\nSendInput ret: {ret}\nGetLastError: {err}\n")
