2

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

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

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

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

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

. 编辑:

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

.

问题是: 我以错误的方式执行鼠标移动事件?

我怎样才能解决这个问题?

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

4

2 回答 2

1

我只是忘了用增量值调用 CGSetIntegerValueField(kCGEventMouseDeltaX, ...) (和 Y)... =P

于 2012-05-04T05:41:26.653 回答
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)
于 2015-09-12T17:12:58.507 回答