我有一个应用程序,它使用 Apple 的 NSTrackingArea API 通过调用
mouseEntered
来处理 mouseMoved
、mouseExited
和 NSView::addTrackingArea
事件。这通常工作得很好,除了我希望能够在拖动事件期间跟踪光标在屏幕上的位置。
有没有办法订阅 NSView 的事件来确定鼠标拖动事件期间光标的位置?
我当前的代码片段:
- (instancetype)initWithCallback:(LocationUpdateCallback)callback
andView:(NSView*)nsView {
if ((self = [super init])) {
_callback = std::move(callback);
constexpr NSTrackingAreaOptions kTrackingOptions =
NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited |
NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect |
NSTrackingEnabledDuringMouseDrag;
NSTrackingArea* trackingArea =
[[NSTrackingArea alloc] initWithRect:NSZeroRect
options:kTrackingOptions
owner:self
userInfo:nil];
_trackingArea.reset(trackingArea);
[nsView addTrackingArea:trackingArea];
}
return self;
}
- (void)mouseMoved:(NSEvent*)theEvent {
...
}
- (void)mouseEntered:(NSEvent*)theEvent {
...
}
- (void)mouseExited:(NSEvent*)theEvent {
...
}
我得出的结论是,NSTrackingArea API 不支持查找鼠标位置,并使用 Willeke 的建议,对拖动事件使用事件监视器。添加以下代码片段会产生我想要的行为:
NSEvent* (^mouseDragged)(NSEvent*) = ^NSEvent*(NSEvent* event) {
// Handle the mouse dragged event.
...
return event;
};
const NSEventMask drag_mask = NSEventMaskLeftMouseDragged |
NSEventMaskRightMouseDragged |
NSEventMaskOtherMouseDragged;
_monitor_id = [NSEvent addLocalMonitorForEventsMatchingMask:drag_mask
handler:mouseDragged];