Python运动仿真:Python鼠标运动仿真在游戏中的应用

我正在研究使用 Kinect 玩视频游戏。这需要同时模拟键盘和鼠标事件。我已经发现带有 ctypes 的 SendInput () 的键盘事件在 Skyrim 和 Minecraft 中都适用。我还发现 ctypes 的 mouse_event () 在 Skyrim 和 Minecraft 中都适用于模拟鼠标按钮。这些是我到目前为止发现的解决方案,似乎对 Skyrim 和

我遇到的主要问题是在 Skyrim 内移动玩家的相机。我能够使用 ctypes 的 SetUserPos () 和 ctypes 的 mouse_event () 在 Minecraft 中移动相机。但是这两种解决方案都不适用于 Skyrim。我也尝试过使用 SendInput () 在 Skyrim 中移动玩家的相机,但是每次光标移动时,SendInput ()

所以无论如何,我可能能够模拟 Skyrim 或其他可能类似地处理鼠标输入的游戏中的相机运动吗?我愿意使用 C / C ++ 来完成这项任务,但是直接 Python 会更可取。感谢您可能有的任何建议!

我也要离开我用来让我的显示器去空白的代码。我想 SendInput () 可能不会为 Skyrim 内的相机移动工作,但也许我只是做了一些可怕的错误。(我也得到了的大部分代码从大量的线程在线。)

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

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

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

在 Windows 的幕后,它制作了与您正在使用的ctypes代码类似的代码,因此它可能可以在像 Skyrim 这样的游戏中控制相机。

PyAutoGUI 适用于 Windows,Mac 和 Linux 以及 Python 2 和 3。它还可以模拟键盘,进行鼠标拖动,拍摄屏幕截图以及对屏幕截图进行简单的图像识别。完整文档位于https://pyautogui.readthedocs.org/

0

我已经修复了你的代码,它在 win10 中为我工作。请查看更改并尝试。

这将相对于当前位置移动光标

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, 0, ctypes.pointer(extra))
    cmd = Input(ctypes.c_ulong(0), ii_)
    ctypes.windll.user32.SendInput(1, ctypes.pointer(cmd), ctypes.sizeof(cmd))
def main():
    #mouse = Mouse()
    MoveMouse(1,15)
    time.sleep(3)
    MoveMouse(1,-15)
    time.sleep(3)
    MoveMouse(1,15)
    time.sleep(3)
    MoveMouse(2,15)
main()

但是您也可以使用ctypes.windll.user32.SetCursorPos(x,y)直接移动到像素位置。

这将光标移动到屏幕上 x / y 轴的像素位置

import ctypes
# Move cursor to x 500 and y 500
ctypes.windll.user32.SetCursorPos(500,500)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(214)
Colmo空间站空调:无法使用Python连接简单的国际空间站api
上一篇
ӡˢerp:设计 ERP系统(python erp open source)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(78条)