2

先来点上下文。本质上,我有一个覆盖桌面的窗口。在它上面我有一些允许用户交互的 WebKit WebView 视图。正如人们所期望的那样,默认情况下,当另一个应用程序处于活动状态时,它不会接收到这些事件(例如悬停、鼠标输入和单击)。我可以通过先单击我的窗口,然后移动鼠标来使其工作,但这不利于可用性。我还设法让它在光标进入时激活窗口,但它远非理想而且相当hacky。

因此,我尝试使用跟踪区域。目前在 WebViews superview 我有这个跟踪区域:

NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
                                                                options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways
                                                                owner:self
                                                                userInfo:nil];

这可以按我的意愿工作,我正在接收所有鼠标事件。但是,WebView 似乎没有按预期响应。JavaScript 鼠标移动事件仅在我按住并拖动时触发,而不仅仅是悬停和拖动。

我尝试使用 hitTest 来获得正确的视图,但似乎没有任何效果。这是一个示例方法,我使用的是 isHandlingMouse 布尔值,因为没有它,似乎由于某种原因创建了无限循环:

- (NSView *)handleTrackedMouseEvent: (NSEvent *)theEvent{
    if(isHandlingMouse)
        return nil;
    isHandlingMouse = true;
    NSView *hit = [self hitTest: theEvent.locationInWindow];
    if (hit && hit != self) {
        return hit;
    }
    return nil;
}

- (void)mouseMoved:(NSEvent *)theEvent{
    NSView *hit = [self handleTrackedMouseEvent: theEvent];
    if (hit){
        [hit mouseMoved: theEvent];
    }
    isHandlingMouse = false;
}

“命中”视图是一个 WebHTMLView,它似乎是一个私有类。一切似乎都应该正常工作,但也许我正在做的事情正在破坏它,或者我错误地将事件发送到 WebHTMLView。

4

1 回答 1

2

发布一个示例 Xcode 项目,以便人们更轻松地测试此问题的解决方案。

我正在做类似的事情,并且需要大量的试验和错误才能找到解决方案。您可能需要继承 NSWindow 并添加- (BOOL)canBecomeKeyWindow { return YES; },然后每当您检测到鼠标在您的窗口上时,您可能会调用[window orderFrontRegardless]它,以便它可以正确捕获鼠标事件。

于 2015-04-14T17:27:31.973 回答