是否阻止“mouseMovedEvent”回调处理移动?或者暂时全局隐藏光标



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

我已经设置了一个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);

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

我可能会使用:全局隐藏光标(从后台应用程序),但我怀疑这是否合法。

有什么想法吗?

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

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;
}

您正试图修改kCGHIDEventTap位置的事件,

指定在HID系统事件进入窗口服务器的位置放置一个事件抽头。

不幸的是,CGEventTapCreate()文档说:

只有作为根用户运行的进程才能在HID事件进入窗口服务器的点处定位事件抽头;对于其他用户,此函数返回NULL

我怀疑这与你的困难有很大关系,尽管医生们似乎与正在发生的事情不太相符(他们已经四岁多了)。

也许您可以将此功能拆分为一个具有超级用户权限的单独进程,使应用程序的其余部分处于正常用户模式?我相信还有一种方法可以为您的程序执行的特定操作请求root权限。

相关内容

最新更新