模拟用于控制游戏的Python按键

问题描述 投票:27回答:3

我正在尝试使用Kinect和Python控制游戏(我的两个测试游戏是Half Life 2和Minecraft)。一切正常,只有一件事。游戏将响应模拟的鼠标事件和模拟的鼠标移动(鼠标事件通过ctypes完成,鼠标移动通过pywin32完成)。但是,问题在于游戏忽略了模拟按键。他们两个都将在聊天窗口(Minecraft)或开发人员控制台(Half Life 2)中拾取模拟按键,但是在玩实际游戏时不会。

我尝试了几种发送按键的方法:

import win32com.client as client
wsh = client.Dispatch('WScript.Shell')
wsh.AppActivate(gameName)
wsh.SendKeys(key)

和:

import win32api
win32api.keybd_event(keyHexCode, 0, 0)

和:

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

我应该指出最后一个中的代码不是我的,这里是关于Stack Overflow的另一个问题。

有人知道为什么这些都不起作用吗?什么是正确的方法?

我正在尝试使用Kinect和Python控制游戏(我的两个测试游戏是Half Life 2和Minecraft)。一切正常,只有一件事。游戏将响应模拟的鼠标事件,并...

python python-2.7 keypress simulate
3个回答
33
投票

我在尝试模拟《半条命2》中的按键时遇到了同样的问题,正如罗宾所说,解决方案是使用ScanCodes而不是VK。


3
投票

[该游戏可能正在使用DirectInput设备。


0
投票

任何人都可以更新此问题的答案吗?

© www.soinside.com 2019 - 2024. All rights reserved.