1

I am trying to control a Vehicle in GTA5 using Python, by Using Scancodes.

I've already tried using Scancodes, and although I'm getting keypresses on Python Shell and all text based applications, GTA 5 refuses to take the input.

import ctypes
import time

for i in list(range(4)) [::-1]:
    print(i+1)
    time.sleep(1)

SendInput = ctypes.windll.user32.SendInput

W=0x11
S=0x1F
D=0x20
A=0x1E

# C struct redefinitions 
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
    _fields_ = [("wVk", ctypes.c_ushort),
                ("wScan", ctypes.c_ushort),
                ("dwFlags", ctypes.c_ulong),
                ("time", ctypes.c_ulong),
                ("dwExtraInfo", PUL)]

class HardwareInput(ctypes.Structure):
    _fields_ = [("uMsg", ctypes.c_ulong),
                ("wParamL", ctypes.c_short),
                ("wParamH", ctypes.c_ushort)]

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)]

# Actuals Functions

def PressKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def ReleaseKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))


if __name__=='__main__':
    while (True):
        PressKey(0x11)
        time.sleep(1)
        ReleaseKey(0x11)
        time.sleep(1)

This code is taken from another thread Simulate Python keypresses for controlling a game

The script needs to make a character move forward ingame by pressing 'W' automatically.

But I am unable to get it to work on GTA 5. However, the same code was used in this video :- https://www.youtube.com/watch?v=tWqbl9IUdCg&list=PLQVvvaa0QuDeETZEOy4VdocT7TOjfSA8a&index=3 and it worked.

SomeCoder
  • 75
  • 1
  • 7
  • Welcome to StackOverflow. Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. [Minimal, complete, verifiable example](https://stackoverflow.com/help/minimal-reproducible-example) applies here. We cannot effectively help you until you post your MCVE code and accurately specify the problem. We should be able to paste your posted code into a text file and reproduce the problem you specified. StackOverflow is not a design, coding, research, or tutorial resource. – Prune Jun 26 '19 at 16:37
  • Can you try running your python script as admin? I do similar things for other games and running the script as admin is required, otherwise the game will filter out your virtual key-presses. – SyntaxVoid supports Monica Jun 26 '19 at 17:38
  • Tried running my script as admin with [This](https://stackoverflow.com/questions/19672352/how-to-run-python-script-with-elevated-privilege-on-windows) But to no avail. – SomeCoder Jun 27 '19 at 13:09

1 Answers1

0

Open cmd as admin, cd to the directory and run the script. quickly alt-tab before the 4 second timer finishes. and it will work.

ps: even I was trying the same and found this issue, tried out @SyntaxVoid supports Monica and tried it. if you run python idle as admin it won't work. you need to use cmd.

you need to alt-w-tab to get out of gta5

satyamedh
  • 49
  • 1
  • 10