Как управлять Rainbow Six Siege, используя ctypes? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь управлять игрой Rainbow Six Siege через python. Я нашел некоторый код, который использует библиотечные ctypes для создания событий мыши, но когда он используется в игре (в режиме одиночной игры, террористическая охота), он автоматически заставляет меня смотреть на землю.

Я пробовал разные комбинации флагов MOUSEEVENTF_MOVE и MOUSEEVENTF_ABSOLUTE, но безрезультатно. Пока это единственная библиотека, которая вообще сумела повлиять на игру. Все остальные ничего не делают, когда я сосредоточен на окне игры.

import ctypes

class MouseInput(ctypes.Structure):
    _fields_ = [("dx", ctypes.c_long),
                ("dy", ctypes.c_long),
                ("mouseData", ctypes.c_ulong),
                ("dwFlags", ctypes.c_ulong),
                ("time",ctypes.c_ulong),
                ("dwExtraInfo", PUL)]

class Input_I(ctypes.Union):
    _fields_ = [("ki", KeyBdInput),
                 ("mi", MouseInput),
                 ("hi", HardwareInput)]

class Input(ctypes.Structure):
    _fields_ = [("type", ctypes.c_ulong),
                ("ii", Input_I)]

def move_mouse(x, y):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    x = int(x*(65536/ctypes.windll.user32.GetSystemMetrics(0))+1)
    y = int(y*(65536/ctypes.windll.user32.GetSystemMetrics(1))+1)
    ii_.mi = MouseInput(x, y, 0, 0x0001 | 0x8000, 0, ctypes.pointer(extra))
    x = Input(ctypes.c_ulong(0), ii_)
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

Я хочу иметь возможность перемещать мышь на определенную величину, сдвигая перспективу персонажей в Rainbow Six Siege. Я считаю, что мышь пытается достичь фиксированной точки на экране, что невозможно из-за того, что перемещение мыши только перемещает перспективу персонажа. Это заставляет его вести себя хаотично, когда он активен, путешествуя намного дальше, чем мне хотелось бы.

...