Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Cocoa:如何发送正确的鼠标增量事件?_Macos_Cocoa_Events_Mouse - Fatal编程技术网

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

Macos Cocoa:如何发送正确的鼠标增量事件?,macos,cocoa,events,mouse,Macos,Cocoa,Events,Mouse,我正在为MacOSX(10.7.3)制作一个应用程序,使用gamepad中的模拟棒控制鼠标。 目前它运行得很好,我可以在桌面和大多数游戏中控制光标。但在Team Fortress 2中,我无法控制目标,但可以在菜单中控制光标。鼠标滚轮和点击在任何地方都有效。 另一件奇怪的事情是,当我移动真正的鼠标时,目标在正常瞄准之前“跳过”了我的“虚拟鼠标”的移动距离,所以它在某种程度上接收到了事件 游戏选项“原始鼠标输入”被禁用(我认为osx甚至不支持它)。一个类似的应用程序可以成功地控制目标 我怀疑游戏正

我正在为MacOSX(10.7.3)制作一个应用程序,使用gamepad中的模拟棒控制鼠标。 目前它运行得很好,我可以在桌面和大多数游戏中控制光标。但在Team Fortress 2中,我无法控制目标,但可以在菜单中控制光标。鼠标滚轮和点击在任何地方都有效。 另一件奇怪的事情是,当我移动真正的鼠标时,目标在正常瞄准之前“跳过”了我的“虚拟鼠标”的移动距离,所以它在某种程度上接收到了事件

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

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

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

编辑:垃圾代码删除

。 编辑:

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

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

如何解决此问题?

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

我只是忘了用delta值调用CGSetIntegerValueField(kCGEventMouseDeltaX…)(和Y)=P

在短短几个小时的谷歌搜索和实验后,终于实现了这一点:)看起来Rodrigo试图说,在构建鼠标事件后,你必须调用

kCGMouseEventDeltaX
上的
CGEventSetIntegerValueField
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)

我也有同样的问题。。。我想知道你是否能更好地解释一下你是如何解决的?我只是把CGSetIntegerValueField()和其余的代码放在一起,解决了这个问题。这是相关的:谷歌搜索
CGSetIntegerValueField
kCGEventMouseDeltaX
只返回这个页面和StackOverflow克隆:(@Rodrigo,如果你还在那里,你能发布一些代码,或者提供一些文档的链接吗?试图做基本相同的事情,我几乎不知所措!