全球鼠标在Cocoa中移动了事件
-
06-07-2019 - |
题
有没有办法在Cocoa中注册全局鼠标移动事件?我能够使用Carbon的InstallEventHandler()
注册事件,但更喜欢Cocoa的等价物。我已经查找了NSNotificationCenter
事件,但似乎没有任何公共事件名称(有私有名称吗?)
或者,有没有办法将NSTrackingArea
用于带有clearColor
背景的视图?
该应用仅限Snow Leopard。
解决方案
在SnowLeopard中,NSEvent
上有一个新的类方法,它可以完全符合您的要求:+ (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
。你<!>#8217;我想要mask = NSMouseMovedMask
。
其他提示
StackOverflow上已经提出了类似的问题: 如何制作透明的NSView子类句柄鼠标事件?
总而言之,tansparent视图方法不起作用。 Quartz Event Taps似乎是最好的答案。
以下是使用水龙头的一些提示:
-
使用
CGEventTapCreate
创建水龙头。
a)对于位置(第一个)参数,您可能希望使用kCGSessionEventTap
。
b)对于放置(第二)参数,您可能需要kCGHeadInsertEventTap
。
c)对于事件掩码参数,请尝试(1 << kCGEventMouseMoved)
。 -
使用
CFMachPortCreateRunLoopSource
创建一个运行循环源,将事件抽头作为第二个参数传递。 -
将运行循环源添加到运行循环中。假设您希望将其添加到主运行循环中,请执行以下操作:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
-
使用
CGEventTapEnable
启用事件点按
醇>
如果您想跟踪鼠标,无论它在哪里,您都需要一个CGEventTap。没有Cocoa等价物。如果您只想在应用程序中跟踪它,那么您应该解释为什么您发现自己无法更彻底地这样做。