在Cocoa中全局鼠标移动事件

10

有没有一种方法在Cocoa中注册全局鼠标移动事件?我能够使用Carbon的InstallEventHandler()注册事件,但更喜欢Cocoa等效方法。我已经寻找NSNotificationCenter事件,但似乎没有公共事件名称(是否有私有事件名称?)

或者,是否有一种方法可以为具有clearColor背景的视图使用NSTrackingArea

该应用程序仅支持Snow Leopard。

3个回答

24

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



12

类似的问题在StackOverflow上已经有人提问过:

如何让透明的NSView子类处理鼠标事件?

总结一下,透明视图方法不起作用。Quartz事件捕捉似乎是最好的答案。

以下是使用事件捕捉的一些提示:

  1. 使用CGEventTapCreate创建事件捕捉。
    a) 对于位置(第一个)参数,您可能希望使用kCGSessionEventTap
    b) 对于放置(第二个)参数,您可能希望使用kCGHeadInsertEventTap
    c) 对于事件掩码参数,请尝试使用(1 << kCGEventMouseMoved)

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

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

  4. 使用CGEventTapEnable启用事件捕捉


谢谢帮助。现在我对事件捕捉更加了解了。不过最终我使用了Ben的NSEvent方法。 - Colin Gislason

3

如果你想追踪鼠标无论它在哪里,你需要使用CGEventTap。没有Cocoa的等效物。如果你只想在你的应用程序中跟踪它,那么你应该更加详细地解释为什么你无法这样做。


这对我来说确实完美地起作用了,但是Ben的答案绝对正是我在寻找的。 - Colin Gislason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接