Cocoa:如何发送适当的鼠标delta事件?

时间:2012-05-01 19:04:03

标签: macos cocoa events mouse

我正在制作一个应用程序,使用Mac OS X游戏手柄中的模拟摇杆控制鼠标(10.7.3)。 目前它工作得很好,我可以在桌面和大多数游戏中控制光标。但是在Team Fortress 2中,我无法控制目标,但可以控制菜单中的光标。鼠标滚轮和点击无处不在。 另一个奇怪的事情是,当我移动真正的鼠标时,目标在正常瞄准之前“跳过”我的“虚拟鼠标”的行进距离,所以它有点接收事件。

游戏选项“Raw mouse input”被禁用(我认为它甚至不支持osx)。类似的应用程序可以成功地控制目标。

我怀疑游戏正在寻找“增量运动”或“相对运动”事件或任何类似事件,但我的代码使用绝对位置设置光标的位置。不要犹豫如何改变这一点。

以下是用于发送mouseMoved事件的代码片段:

编辑:删除了糟糕的代码!

。 编辑:

另外,因为我这样做,我需要手动检查屏幕边界以防止光标疯狂。因此,在多屏幕设置中,当用户更改分辨率时,它会变得更糟。 如果我可以发送移动量并让操作系统处理约束光标,那会好得多。

问题是: 我正在以错误的方式做鼠标移动事件?

我该如何解决这个问题?

EDIT2: 所以,这只是一个愚蠢的错误,抱歉= P

2 个答案:

答案 0 :(得分:1)

我忘了用delta值调用CGSetIntegerValueField(kCGEventMouseDeltaX,...)(和Y)... = P

答案 1 :(得分:0)

最后通过谷歌搜索和实验几小时后才开始工作了:)看起来罗德里戈试图说你必须在CGEventSetIntegerValueFieldkCGMouseEventDeltaX上打电话给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)