Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 非按键窗口时,N跟踪区域未完全工作_Cocoa_Webview_Nsevent_Nstrackingarea - Fatal编程技术网

Cocoa 非按键窗口时,N跟踪区域未完全工作

Cocoa 非按键窗口时,N跟踪区域未完全工作,cocoa,webview,nsevent,nstrackingarea,Cocoa,Webview,Nsevent,Nstrackingarea,先来点背景知识。实际上,我有一个覆盖桌面的窗口。在它上面,我有一些WebKit WebView视图,允许用户交互。根据deafult,正如人们所预料的,当另一个应用程序处于活动状态时,它不会收到这些事件(如悬停、鼠标输入和单击)。我可以先点击我的窗口,然后移动鼠标,但这对可用性不好。我还设法让它在光标进入时激活窗口,但这远远不够理想,而且相当粗糙 所以我试着用一个追踪区域。目前在WebViews superview上,我有一个跟踪区域: NSTrackingArea *trackingArea

先来点背景知识。实际上,我有一个覆盖桌面的窗口。在它上面,我有一些WebKit WebView视图,允许用户交互。根据deafult,正如人们所预料的,当另一个应用程序处于活动状态时,它不会收到这些事件(如悬停、鼠标输入和单击)。我可以先点击我的窗口,然后移动鼠标,但这对可用性不好。我还设法让它在光标进入时激活窗口,但这远远不够理想,而且相当粗糙

所以我试着用一个追踪区域。目前在WebViews superview上,我有一个跟踪区域:

NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
                                                                options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways
                                                                owner:self
                                                                userInfo:nil];
这是我想要的,我正在接收所有鼠标事件。然而,网络视图似乎没有按预期的那样响应。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;
}

“hit”视图是一个WebHTMLView,它似乎是一个私有类。一切看起来都应该正常工作,但可能是我正在做的某件事破坏了它,或者我将事件错误地发送到WebHTMLView。

发布一个示例Xcode项目,让人们更容易测试此问题的解决方案

我当时也在做类似的事情,需要反复试验才能找到解决方案。您可能需要子类NSWindow并添加
-(BOOL)canBecomeKeyWindow{return YES;}
,然后每当您检测到鼠标位于窗口上方时,您可以调用
[window orderfrontwherence]
,以便它能够正确捕获鼠标事件