Cocoa:如何发送正确的鼠标增量事件?

3
我正在制作一个应用程序,使用游戏手柄上的模拟杆来控制鼠标在Mac OS X(10.7.3)上的移动。 目前它运行得非常好,在桌面和大多数游戏中都可以控制光标。但是在《Team Fortress 2》中,我无法控制瞄准,但可以在菜单中控制光标。鼠标滚轮和点击功能在任何地方都有效。 另一个奇怪的问题是,当我移动真正的鼠标时,“虚拟鼠标”在瞄准之前会“跳跃”旅行的距离,因此它在某种程度上正在接收事件。
游戏选项“原始鼠标输入”已禁用(我认为在osx中甚至不支持)。类似的应用程序可以成功地控制瞄准。
我怀疑游戏正在寻找“增量运动”或“相对运动”事件或任何类似的东西,但我的代码使用绝对位置设置光标的位置。不确定如何更改这个。
以下是用于发送mouseMoved事件的代码片段:
编辑:删除了糟糕的代码!
同时,由于我是这样做的,我需要手动检查屏幕边界以防止光标失控。因此,在多屏幕设置和用户更改分辨率时,情况会变得更糟。如果我可以只发送移动量并让操作系统处理限制光标,那将会好得多。
问题是:我是否以错误的方式进行鼠标移动事件?
我该如何解决这个问题?
编辑2: 所以,那只是一个愚蠢的错误,抱歉=P
2个回答

1

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


我遇到了同样的问题...不知道你能否更好地解释一下你是如何解决它的? - Max
1
我只是将CGSetIntegerValueField()和其他代码一起包含进来,问题就解决了。 - Rodrigo
这是相关的:https://xkcd.com/979/ 谷歌搜索CGSetIntegerValueFieldkCGEventMouseDeltaX只返回此页面和StackOverflow克隆 :( @Rodrigo,如果你还在,请发布一些代码或给出一些文档链接?我也在尝试做基本相同的事情,但几乎毫无头绪! - doctaphred

1

终于在仅仅几个小时的谷歌搜索和实验后搞定了这件事 :) 看起来Rodrigo是想说,在构造鼠标事件后,你必须在鼠标事件上调用CGEventSetIntegerValueField以及kCGMouseEventDeltaXkCGMouseEventDeltaY

我的代码,使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接