如何制作一个在全屏窗口上方显示的Cocoa窗口?

9
我需要在OS X程序中制作一个“全屏覆盖窗口”。准确地说,该窗口必须始终位于所有其他窗口的顶部,包括非最大化窗口空间中的菜单栏顶部以及其自己空间中的最大化窗口顶部,并且在Exposé期间始终处于顶部。它不能参与“更改空间”动画;即其位置必须始终相对于物理屏幕固定。(窗口将是半透明的并且会忽略鼠标事件,但我已经知道如何做到这一点。)
如何实现这种“覆盖窗口”行为?我已经有了以下进展:
- 我应该将window.level设置为CGWindowLevelKey(kCGMaximumWindowLevelKey),以便它始终位于同一空间的其他窗口的顶部。 - 我应该设置NSWindowCollectionBehaviorStationary,以便该窗口在Exposé期间保持不动。
我不知道的是如何在切换空间时保持此行为。我认为我应该设置NSWindowCollectionBehaviorCanJoinAllSpaces,但它的行为有两个问题:
  • 窗口不会出现在其他全屏窗口的上方。
  • 窗口在每个空间中都是重复的,而不是停留在所有空间的顶部。这很重要,因为涉及到空间切换动画。

我听说使用NSPanel可能有帮助, 但我也无法使其起作用。

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


你是否已经找到了这个问题的答案?我也需要在另一个应用程序的全屏窗口上方显示一个窗口。 - Mark Bessey
@MarkBessey,我确实找到了一个解决方案,使用NSPanel。等我有时间的时候,我会尝试用一些示例代码来回答这个问题。 - jameshfisher
@jameshfisher,你能分享一下你的解决方案吗?我有一个类似的问题,我已经尝试了你在描述中提到的方法,但不幸的是它们都没有起作用。 - Jay Wang
@jameshfisher 如果您方便的话,能否分享一下您的解决方案?我真的非常需要。 - PodBlood
还有人解决了这个问题吗? - Graham Leggett
2个回答

2
你应该使用window.level = CGWindowLevelForKey(.MaximumWindowLevelKey)
关于空间的部分我无法提供帮助。

啊,是的,我已经在做那个了——抱歉没有表达清楚。我已经编辑了我的问题。 - jameshfisher

0

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

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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接