我找到了一个通过DirectInput模拟鼠标移动的解决方案。重点是使用Python脚本在3D游戏中导航角色。这意味着必须使用相对鼠标移动。
一切正常,但当我尝试计算x单位(在MouseMoveTo函数中)和Angular 之间的关系时,我发现aritmetics不工作好。
例如:
当我移动鼠标时向左移动2 x 200个单位然后向右移动1 x 400个单位字符没有看向相同的方向(如果在桌面上,光标不在相同的位置)
- 200个小于1400个**
如果我试图动画运动(例如将运动分为50步),它会变得更糟。
我是做错了什么还是正常行为?如果是正常行为,我是否可以计算出传递给MouseMove To()的正确单位数?
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 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 MouseMoveTo(x, y):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.mi = MouseInput(x, y, 0, 0x0001, 0, ctypes.pointer(extra))
command = Input(ctypes.c_ulong(0), ii_)
ctypes.windll.user32.SendInput(1, ctypes.pointer(command), ctypes.sizeof(command))
2条答案
按热度按时间c6ubokkw1#
好吧...所以问题是Windows的“增强指针精度”设置,简而言之,这使得小(慢)鼠标移动更小,大(快)更大...
关机后,一切正常。
有关此Windows“功能”的更多信息,请单击https://www.howtogeek.com/321763/what-is-enhance-pointer-precision-in-windows/
o3imoua42#
只需运行下面的代码...