【问题标题】:Global Mouse Moved Events in CocoaCocoa 中的全局鼠标移动事件
【发布时间】:2009-10-27 01:55:07
【问题描述】:

有没有办法在 Cocoa 中注册全局鼠标移动事件?我可以使用 Carbon 的InstallEventHandler() 注册活动,但更喜欢 Cocoa 等价物。我已经查找了NSNotificationCenter 事件,但似乎没有任何公共事件名称(有私人事件名称吗?)

或者,有没有办法将NSTrackingArea 用于具有clearColor 背景的视图?

该应用仅适用于 Snow Leopard。

【问题讨论】:

    标签: cocoa mouse macos-carbon nsnotifications mousemove


    【解决方案1】:

    在 SnowLeopard 中,NSEvent 上有一个新的类方法,它完全符合您的要求:+ (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block。你会想要mask = NSMouseMovedMask

    【讨论】:

    【解决方案2】:

    在 StackOverflow 上已经提出了一个类似的问题: How to make a transparent NSView subclass handle mouse events?

    总而言之,透明视图方法不起作用。 Quartz Event Taps 似乎是最好的答案。

    以下是使用水龙头的一些提示:

    1. 使用CGEventTapCreate 创建水龙头。
      a) 对于位置(第一个)参数,您可能需要使用 kCGSessionEventTap
      b) 对于展示位置(第二个)参数,您可能需要kCGHeadInsertEventTap
      c) 对于事件掩码参数,请尝试(1 << kCGEventMouseMoved)

    2. 使用CFMachPortCreateRunLoopSource 创建一个运行循环源,将事件点击作为第二个参数传递。

    3. 将运行循环源添加到您的运行循环。假设您希望将其添加到主运行循环中,请执行以下操作: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

    4. 使用CGEventTapEnable启用事件点击

    【讨论】:

    • 感谢您的帮助。我现在更好地理解了事件水龙头。不过,我最终还是使用了 Ben 的 NSEvent 方法。
    【解决方案3】:

    如果你想跟踪鼠标,不管它在哪里,你需要一个 CGEventTap。没有可可等价物。如果您只想在应用程序中跟踪它,那么您应该更彻底地解释为什么您发现自己无法做到这一点。

    【讨论】:

    • 这对我来说确实很有效,但 Ben 的答案绝对是我想要的。
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2011-09-01
    • 2014-11-22
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多