全球鼠标在Cocoa中移动了事件

Col*_*son 10 mouse cocoa macos-carbon nsnotifications mousemove

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

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

该应用程序仅限Snow Leopard.

Ben*_*itz 23

在SnowLeopard中有一个新的类方法,NSEvent它正是你想要的:+ (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block.你想要的mask = NSMouseMovedMask.


Dou*_*son 12

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

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

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

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

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

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

  4. 启用事件点击 CGEventTapEnable