有没有一种方法在Cocoa中注册全局鼠标移动事件?我能够使用Carbon的InstallEventHandler()
注册事件,但更喜欢Cocoa等效方法。我已经寻找NSNotificationCenter
事件,但似乎没有公共事件名称(是否有私有事件名称?)
或者,是否有一种方法可以为具有clearColor
背景的视图使用NSTrackingArea
?
该应用程序仅支持Snow Leopard。
有没有一种方法在Cocoa中注册全局鼠标移动事件?我能够使用Carbon的InstallEventHandler()
注册事件,但更喜欢Cocoa等效方法。我已经寻找NSNotificationCenter
事件,但似乎没有公共事件名称(是否有私有事件名称?)
或者,是否有一种方法可以为具有clearColor
背景的视图使用NSTrackingArea
?
该应用程序仅支持Snow Leopard。
在SnowLeopard中,NSEvent有一个新的类方法,可以完全满足您的要求:
+(id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent *)block)
。 您需要的是mask = NSMouseMovedMask
。
类似的问题在StackOverflow上已经有人提问过:
总结一下,透明视图方法不起作用。Quartz事件捕捉似乎是最好的答案。
以下是使用事件捕捉的一些提示:
使用CGEventTapCreate
创建事件捕捉。
a) 对于位置(第一个)参数,您可能希望使用kCGSessionEventTap
。
b) 对于放置(第二个)参数,您可能希望使用kCGHeadInsertEventTap
。
c) 对于事件掩码参数,请尝试使用(1 << kCGEventMouseMoved)
。
使用CFMachPortCreateRunLoopSource
创建运行循环源,将事件捕捉作为第二个参数传递。
将运行循环源添加到您的运行循环中。假设您要将其添加到主运行循环中,请执行以下操作:CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
使用CGEventTapEnable
启用事件捕捉
如果你想追踪鼠标无论它在哪里,你需要使用CGEventTap。没有Cocoa的等效物。如果你只想在你的应用程序中跟踪它,那么你应该更加详细地解释为什么你无法这样做。
+ addGlobalMonitorForEventsMatchingMask:handler:
- Joseph