【问题标题】:How can I make a Cocoa window which appears on top of fullscreen windows?如何制作一个出现在全屏窗口顶部的 Cocoa 窗口?
【发布时间】:2016-04-09 16:20:50
【问题描述】:

我需要在 OS X 的程序中创建一个“全屏覆盖窗口”。确切地说,该窗口必须始终位于所有其他窗口的顶部,包括非最大化窗口中的菜单栏顶部空间,以及在他们自己的空间中最大化的窗户顶部,以及在 Exposé 期间的顶部。不得参与“改变空间”动画;即,它的位置必须始终相对于物理屏幕固定。 (窗口将是半透明的,并且会忽略鼠标事件,但我已经知道该怎么做。)

如何实现这种“覆盖窗口”行为?我已经走到这一步了:

  • 我应该将window.level 设置为CGWindowLevelKey(kCGMaximumWindowLevelKey),以便它始终位于同一空间中其他窗口的顶部。
  • 我应该设置 NSWindowCollectionBehaviorStationary 以便在 Exposé 期间窗口保持原位。

我不知道在切换空间时如何保持这种行为。我以为我应该设置NSWindowCollectionBehaviorCanJoinAllSpaces,但它的行为有两个问题:

  • 该窗口不会出现在其他全屏窗口之上。
  • 窗口在每个空间上重复,而不是在所有空间顶部的同一位置。这很重要,因为空间切换动画。

I have heard that an NSPanel would help me,但我也无法完成这项工作。

简而言之,一个窗口可以出现在 OS X 中的全屏窗口之上吗?您能提供一个简短的完整示例吗?

【问题讨论】:

  • 我不认为你已经找到了答案?我还需要在另一个应用的全屏窗口之上显示一个窗口。
  • @MarkBessey 我确实找到了解决方案,使用NSPanel。有空我会尝试用一些示例代码来回答这个问题
  • @jameshfisher 你能分享你的解决方案吗?我有一个类似的问题,我已经尝试过你在描述中提到的,但不幸的是它们不起作用。
  • @jameshfisher 如果您有空,您介意分享您的解决方案吗,我真的需要它。
  • 又一个小问题,有人解决了吗?

标签: objective-c macos cocoa


【解决方案1】:

您应该使用window.level = CGWindowLevelForKey(.MaximumWindowLevelKey)

空格部分我帮不了你。

【讨论】:

  • 啊,是的,我已经这样做了——抱歉不清楚。我已经编辑了我的问题。
【解决方案2】:

这是我的解决方案,它工作正常。

NSPanel *test_panel = [[NSPanel alloc] initWithContentRect:NSMakeRect(300, 300, 500, 500) styleMask:NSTitledWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:YES];
[test_panel setReleasedWhenClosed:YES];
[test_panel setHidesOnDeactivate:NO];
[test_panel setFloatingPanel:YES];
[test_panel setStyleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask];
[test_panel setLevel:kCGMainMenuWindowLevel-1];
[test_panel  setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces|NSWindowCollectionBehaviorFullScreenAuxiliary];
[test_panel setCanBeVisibleOnAllSpaces:YES];
[test_panel center];
[test_panel orderFront:nil];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多