Python的鼠标运动模拟游戏中(Python Mouse Movement Emulation i

2019-10-30 01:20发布

我在寻找到使用的Kinect玩视频游戏。 这既需要键盘和鼠标事件的仿真。 我已经想通了,与ctypes的SendInput()键盘事件工作在两个天际和我的世界。 我还发现,ctypes的mouse_event()两个天际和工作的Minecraft用于模拟鼠标按键。 这些是到目前为止,我已经找到了解决方案,似乎两个天际和的Minecraft工作。

我遇到的主要问题是与天际内走动玩家的相机。 我能够使用ctypes的SetUserPos(),也ctypes的mouse_event()左右移动相机的Minecraft。 但无论是解决方案的天际工作。 我一直在使用SendInput()移动玩家的相机在天际也尝试过,但每次光标获取与SendInput()(外连天际)移动时,我的显示器了一会儿那张空白,相机仍然不动(我不知道为什么这样的事情发生了......)

那么,有没有反正我可能能够模拟内天际或其他游戏的摄影机运动,可能处理他们的鼠标输入相似? 我愿意用C / C ++完成这个任务,但简单的Python会更理想。 感谢您的任何你可能有所有的建议!

我还打算要离开我曾经让我的显示器变成空白的代码。 我想SendInput()可能不会为内天际相机移动工作,但也许我只是做了一些可怕的错误。 (我也得到了大部分从线程的众多下面的代码在网上。)

import ctypes
import time

# 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 POINT(ctypes.Structure):
        _fields_ = [("x", ctypes.c_ulong),
                    ("y", ctypes.c_ulong)]


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))  # lint:ok
    x = Input(ctypes.c_ulong(1), ii_)
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def MoveMouse(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, 1, ctypes.pointer(extra))
    x = Input(ctypes.c_ulong(0), ii_)
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def main():
    mouse = Mouse()
    time.sleep(3)
    MoveMouse(100, 100)

main()

Answer 1:

您可以安装的PyPI的PyAutoGUI GUI自动化模块(RUN pip install pyautogui ),然后调用pyautogui.moveTo()点击一个特定的X和屏幕的Y坐标:

>>> import pyautogui
>>> pyautogui.moveTo(50, 100)

在Windows在幕后,这让类似ctypes您正在使用,所以它可能工作来控制摄像机像天际游戏代码。

PyAutoGUI适用于Windows,Mac和Linux,以及Python 2和3,它还可以模拟键盘,鼠标做拖动,采取截图,并做截图的简单图像识别。 全部文档是在https://pyautogui.readthedocs.org/



文章来源: Python Mouse Movement Emulation in Games