在拖动事件期间跟踪光标位置?

问题描述 投票:0回答:1

我有一个应用程序,它使用 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 {
...
}
macos cocoa objective-c++ nstrackingarea
1个回答
0
投票

我得出的结论是,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];
© www.soinside.com 2019 - 2024. All rights reserved.