防止`mouseMovedEvent`回调处理运动?或者全局隐藏光标?

时间:2012-03-28 00:21:54

标签: objective-c macos cocoa macos-carbon

我有一个全局应用程序,可防止鼠标移动到屏幕区域。必须适用于所有应用,而我的应用在后台等等。

我已经设置了一个CGEventTap钩子,它有一个鼠标移动回调。

无论我如何尝试修改/杀死机芯,用户的鼠标移动都会继续通过挂钩。这反映了其他人的经历:https://stackoverflow.com/a/5831573/106761

- (CGEventRef) mouseMovedEvent:(CGEventRef) newUserMouseMovement
{ 
    //Attempt to modify the mouse movement
    CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaX, 0);
    CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaY, 0);
    CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaX, 0.0);

    //Attempt to kill the event
    return NULL;
}
//Mouse movement still works normally.

能够使用CGDisplayMoveCursorToPointCGWarpMouseCursorPosition将光标重新定位回原始位置。

这很好用,但我宁愿完全杀掉这个事件。

问题是,在我能够移动光标之前,原始用户鼠标移动在该点显示光标可视一瞬间。

我正在使用:

CGSetLocalEventsSuppressionInterval(0.0);

增加鼠标移动的频率。但这也使得真实的"光标,在我移动之前,闪光在"禁区"如果用户将鼠标放在我不希望鼠标移动的区域。

我可能会使用:Globally hiding cursor (from background app)但我怀疑Mac App Store是合法的。

有什么想法吗?

编辑:如何创建事件点击:

eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);

...

    CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    if (type == kCGEventMouseMoved) {
        event = [refToSelf mouseMovedEvent:event];
    }

    ...

    return event;
}

1 个答案:

答案 0 :(得分:2)

您正尝试修改kCGHIDEventTap location上的事件,

  

指定在HID系统事件进入窗口服务器的位置放置事件点击。

不幸的是,CGEventTapCreate() doc说:

  

只有以root用户身份运行的进程才能在HID事件进入窗口服务器的位置找到事件点击;对于其他用户,此函数返回NULL

我怀疑这与你的难度密切相关,尽管文档似乎与正在发生的事情(他们已经超过四年)不符。

也许您可以将此功能转移到具有超级用户权限的单独进程中,让您的应用程序的其余部分保持正常用户模式?我相信还有一种方法可以为您的程序采取的特定操作请求root权限。