【问题标题】:Cocoa: How to send proper mouse delta events?Cocoa:如何发送正确的鼠标增量事件?
【发布时间】:2012-05-11 06:44:33
【问题描述】:

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

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

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

这是用于发送 mouseMoved 事件的代码的 sn-p:

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

。 编辑:

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

.

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

我该如何解决这个问题?

编辑2: 所以,这只是一个愚蠢的错误,对不起=P

【问题讨论】:

    标签: macos cocoa events mouse


    【解决方案1】:

    在经过短短几个小时的谷歌搜索和实验之后终于得到了这个工作:) 看起来罗德里戈试图说你必须在构建鼠标事件后在 kCGMouseEventDeltaXkCGMouseEventDeltaY 上调用 CGEventSetIntegerValueField .

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我也有同样的问题...不知道您能否更好地解释一下您是如何解决的?
      • 我只是将 CGSetIntegerValueField() 与其余代码一起包含在内,从而解决了问题。
      • 这是相关的:xkcd.com/979 Google 搜索 CGSetIntegerValueFieldkCGEventMouseDeltaX 只返回此页面和 StackOverflow 克隆 :( @Rodrigo,如果你还在外面,你能发布一些代码吗,或者提供一些文档的链接?尝试做基本相同的事情,但我几乎不知所措!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多