我正在研究使用 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)
cl KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
cl HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
cl 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)]
cl POINT(ctypes.Structure):
_fields_ = [("x", ctypes.c_ulong),
("y", ctypes.c_ulong)]
cl Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
cl 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()
您可以从 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/
我已经修复了你的代码,它在 win10 中为我工作。请查看更改并尝试。
这将相对于当前位置移动光标
import ctypes
import time
# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)
cl KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
cl HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
cl 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)]
cl POINT(ctypes.Structure):
_fields_ = [("x", ctypes.c_ulong),
("y", ctypes.c_ulong)]
cl Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
cl 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)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(41条)