如何创建一个出现在全屏窗口顶部的Cocoa窗口?

时间:2016-01-05 18:14:09

标签: objective-c macos cocoa

我需要在OS X的程序中创建一个“全屏叠加窗口”。确切地说,窗口必须始终位于所有其他窗口的顶部,包括在非最大化窗口的菜单栏顶部空间,在自己空间的最大化窗户之上,以及在Exposé期间的顶部。它不得参与“变革空间”动画;即,其位置必须始终相对于物理屏幕固定。 (窗口将是半透明的,将忽略鼠标事件,但我知道如何执行此操作。)

如何实现这种“叠加窗口”行为?我到目前为止:

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

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

  • 窗口未出现在其他全屏窗口的顶部。
  • 窗口在每个空间都是重复,而不是停留在所有空间的顶部。这很重要,因为空间切换动画。

I have heard that an NSPanel would help me,但我也无法做到这一点。

简而言之, OS X中的全屏窗口顶部是否可以显示一个窗口?你能提供一个简短的完整例子吗?

2 个答案:

答案 0 :(得分:1)

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

我无法帮助你处理空间部分。

答案 1 :(得分: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];