我正在制作一个应用程序,使用Mac OS X游戏手柄中的模拟摇杆控制鼠标(10.7.3)。 目前它工作得很好,我可以在桌面和大多数游戏中控制光标。但是在Team Fortress 2中,我无法控制目标,但可以控制菜单中的光标。鼠标滚轮和点击无处不在。 另一个奇怪的事情是,当我移动真正的鼠标时,目标在正常瞄准之前“跳过”我的“虚拟鼠标”的行进距离,所以它有点接收事件。
游戏选项“Raw mouse input”被禁用(我认为它甚至不支持osx)。类似的应用程序可以成功地控制目标。
我怀疑游戏正在寻找“增量运动”或“相对运动”事件或任何类似事件,但我的代码使用绝对位置设置光标的位置。不要犹豫如何改变这一点。
以下是用于发送mouseMoved事件的代码片段:
编辑:删除了糟糕的代码!
。 编辑:
另外,因为我这样做,我需要手动检查屏幕边界以防止光标疯狂。因此,在多屏幕设置中,当用户更改分辨率时,它会变得更糟。 如果我可以发送移动量并让操作系统处理约束光标,那会好得多。
问题是: 我正在以错误的方式做鼠标移动事件?
我该如何解决这个问题?
EDIT2: 所以,这只是一个愚蠢的错误,抱歉= P
答案 0 :(得分:1)
我忘了用delta值调用CGSetIntegerValueField(kCGEventMouseDeltaX,...)(和Y)... = P
答案 1 :(得分:0)
最后通过谷歌搜索和实验几小时后才开始工作了:)看起来罗德里戈试图说你必须在CGEventSetIntegerValueField
和kCGMouseEventDeltaX
上打电话给kCGMouseEventDeltaY
构建它之后的鼠标事件。
我的代码,使用PyObjC:
from Quartz.CoreGraphics import (
CGEventCreate,
CGEventCreateMouseEvent,
CGEventGetLocation,
CGEventPost,
CGEventSetIntegerValueField,
kCGEventMouseMoved,
kCGHIDEventTap,
kCGMouseEventDeltaX,
kCGMouseEventDeltaY,
)
def mouse_delta(delta_x, delta_y):
"""
Send a MouseMoved event with the given deltaX and deltaY attributes,
but without changing the cursor location.
"""
# Might be a better way to get the current mouse location
x, y = CGEventGetLocation(CGEventCreate(None))
# The `mouseButton` parameter to CGEventCreateMouseEvent is ignored
# unless `mouseType` is kCGEventOtherMouse{Down,Dragged,Up},
# so let's just pass the value 0
event = CGEventCreateMouseEvent(None, kCGEventMouseMoved, (x, y), 0)
CGEventSetIntegerValueField(event, kCGMouseEventDeltaX, delta_x)
CGEventSetIntegerValueField(event, kCGMouseEventDeltaY, delta_y)
return CGEventPost(kCGHIDEventTap, event)