python - 如何使用pywinauto模拟游戏中的按键

标签 python windows directx

一年来我一直在尝试各种事情。我是 python 的初学者。做了欧拉计划的前两道题。

我尝试了几种方法来模拟我玩的游戏中的按键。我可以使用自动热键和宏键盘/鼠标轻松地做到这一点。但是,我想通过 Python 或 C 来完成。

我的猜测是 win32 api 在视频游戏中被忽略,我需要通过 Direct X 模拟按键。

提前致谢。这是我最近的尝试……失败了。

每次运行游戏的新实例时,我都必须捕获/更改 handle 。

我的模拟键可以在浏览器和记事本中使用,但不能在游戏中使用。不工作,我的意思是没有用户输入。

以下代码会切换到窗口,但不会模拟用户的输入。

import pywinauto
import time
from pywinauto import application
app = application.Application()
app.connect_(handle = 0x14002a)
dialogs = app.windows_(handle = 0x14002a)
dlg = app.top_window_()
time.sleep(1)
app.MapleStory.TypeKeys("%A")
time.sleep(1)
app.MapleStory.TypeKeys("%A")
time.sleep(1)
app.MapleStory.TypeKeys("%A")
time.sleep(1)
app.MapleStory.TypeKeys("%A")
time.sleep(1)
app.MapleStory.TypeKeys("%A")
time.sleep(1)
app.MapleStory.TypeKeys("%A")

最佳答案

我过去的自己经历了漫长的旅程。虽然我们在这里有很多东西要学习,但我们发现了:

如果游戏在 DirectX 上运行,将忽略发送虚拟键。 使用 sendenput 并发送 scan_codes。

# http://www.gamespp.com/directx/directInputKeyboardScanCodes.html

import ctypes
import time

SendInput = ctypes.windll.user32.SendInput

W = 0x11
A = 0x1E
S = 0x1F
D = 0x20
Z = 0x2C
UP = 0xC8
DOWN = 0xD0
LEFT = 0xCB
RIGHT = 0xCD
ENTER = 0x1C 

# 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__':
    pressKey(0x11)
    time.sleep(1)
    releaseKey(0x11)
    time.sleep(1)

来源: Simulate Python keypresses for controlling a game http://www.gamespp.com/directx/directInputKeyboardScanCodes.html

感谢 Sentdex 提供有关机器学习的精彩教程。 我一直想对我最喜欢的一些游戏执行此操作,但无法获得 key (由于 DirectX)。

下一步: 用于模拟按键的 Windows 驱动程序工具包...

关于python - 如何使用pywinauto模拟游戏中的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660685/

相关文章:

python - 在 python flask 中使用游标对 postgres 查询进行分页

iphone - 连接手机

python - 只能将元组(不是 "unicode")连接到元组

python - 无法在 Kaggle 内核中使用 'kaggle.competitions'

python - 按公共(public)列合并 2 个 .csv 文件

c++ - 暗图像中的 D3D11 后着色器结果

c++ - 为什么找不到 DirectX 模板?

c - 为什么我必须手动将 OpenGL 库与 MinGW 链接起来?

windows - 如何获得不是主窗体的窗体的任务栏按钮?

c++ - 无法从 NULL 资源创建 RenderTargetView