title: Simulate Python keypresses for controlling a game
body: <p>I'm trying to control a game (my two test games are Half Life 2 and Minecraft) using my Kinect and Python. Everything works except for one thing. The game will respond to simulated mouse events and simulated mouse movement (mouse events are done via ctypes and mouse movement is done using pywin32). The problem however is that the games ignore simulated keypresses. Both of them will pick up the simulated keypresses in either the chat window (Minecraft) or the developer console (Half Life 2) but not while playing the actual game.</p>
  
  <p>I've tried several ways of sending the keypresses:</p>
  
  <pre><code>import win32com.client as client
  wsh = client.Dispatch('WScript.Shell')
  wsh.AppActivate(gameName)
  wsh.SendKeys(key)
  </code></pre>
  
  <p>and:</p>
  
  <pre><code>import win32api
  win32api.keybd_event(keyHexCode, 0, 0)
  </code></pre>
  
  <p>and:</p>
  
  <pre><code>import ctypes
  import time
  
  SendInput = ctypes.windll.user32.SendInput
  
  # 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( hexKeyCode, 0x48, 0, 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( hexKeyCode, 0x48, 0x0002, 0, ctypes.pointer(extra) )
      x = Input( ctypes.c_ulong(1), ii_ )
      ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
  </code></pre>
  
  <p>I should point out the code in the last one isn't mine, it's off another question here on Stack Overflow.</p>
  
  <p>Does anyone know why none of these work and what the correct way to do this is?</p>