【问题标题】:Prevent `mouseMovedEvent` callback from processing the movement? Or globally hide cursor momentarily?防止`mouseMovedEvent`回调处理移动?还是暂时全局隐藏光标?
【发布时间】:2012-04-11 13:47:11
【问题描述】:

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

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

增加鼠标移动触发的频率。但这也会使“真正的”光标在我移动它之前,flash 在“禁止区域”中,如果用户将鼠标放在我不希望鼠标移动的区域上。

我可能会使用: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;
}

【问题讨论】:

  • 你能显示你在创建水龙头时传递的参数吗?
  • 是的,错过了...现在添加。
  • 太棒了!现在,这个进程是否以 root 身份运行?您不能在 HID->window 服务器连接处修改事件,除非以 root 身份修改。
  • 我认为如果应用程序旨在分发,尤其是通过 Mac App Store,我不会以 root 身份运行...真的吗?如果它不是别人可以使用的东西,我们就不要走这条路。
  • 不幸的是,这是您的第 22 条军规。您无法实现这一点,除非您的进程以 root 身份运行,并且您的进程无法以 root 身份运行,因为 App Store 不允许这样做。

标签: objective-c macos cocoa macos-carbon


【解决方案1】:

您正在尝试修改kCGHIDEventTap location 处的事件,其中

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

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

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

我怀疑这与您的困难密切相关,尽管文档似乎与正在发生的事情不完全相符(它们已有四年多的历史了)。

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

【讨论】:

    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多