10

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

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

该应用程序仅是雪豹。

4

3 回答 3

24

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

于 2009-10-27T17:17:45.590 回答
12

StackOverflow 上已经提出了一个类似的问题: 如何使透明的 NSView 子类处理鼠标事件?

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

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

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

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

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

  4. 启用事件点击CGEventTapEnable

于 2009-10-27T17:25:30.847 回答
3

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

于 2009-10-27T02:17:29.080 回答