【问题标题】:Add NSWindow in front of fullscreen app在全屏应用前添加 NSWindow
【发布时间】:2014-05-06 20:04:18
【问题描述】:

我想在所有其他应用程序前面有一个窗口。 我希望此窗口出现在“Alfred”应用等关键字快捷方式上。

我尝试了很多解决方案,但在主屏幕或第二屏幕上的全屏应用程序前面放置 NSWindow 没有任何效果。

我尝试了经典:

[self.window setLevel:NSMainMenuWindowLevel + 1];
[self.window setCollectionBehavior:NSWindowCollectionBehaviorStationary|NSWindowCollectionBehaviorCanJoinAllSpaces|NSWindowCollectionBehaviorFullScreenAuxiliary];
[self.window setHidesOnDeactivate:NO];

除了全屏应用外,它都可以工作。

它适用于带有 [self.videoWindow setStyleMask:NSBorderlessWindowMask] 的 NSPanel; 但仅在主屏幕上。

有人有解决办法吗? Alfred 周围的开发者?

【问题讨论】:

  • 有什么消息吗?您是如何完成这项工作的?

标签: objective-c macos


【解决方案1】:

Alfred 被实现为代理。代理可以在全屏应用的空间上显示 Windows。您还应该让您的应用程序成为代理。这可以通过将 Application is Agent 标志添加到您的 App 的 info.plist 文件并将值设置为 YES 来实现。

【讨论】:

  • 这个以及将窗口的 level 设置为 CGShieldingWindowLevel() 对我有用。
【解决方案2】:

我设法通过以下方式在全屏应用程序顶部显示辅助窗口:

  • self.collectionBehavior = NSWindowCollectionBehaviorMoveToActiveSpace | NSWindowCollectionBehaviorFullScreenAuxiliary;
  • 不要调用 [NSApp activateblabla];
  • 制作应用程序 LSUIElement,不要通过 TransformProcessType 显示 Dock 图标

但是,还不知道如何为具有 Dock 图标的应用正确显示它。另一方面,我不知道哪个应用程序可以在拥有 Dock 图标时做到这一点。

【讨论】:

    【解决方案3】:

    这可能取决于相关应用程序如何实现全屏,但您可能只需要使用比NSMainMenuWindowLevel + 1 更高的窗口级别,例如CGShieldingWindowLevel()+1

    您可以从Apples developer downloads 下载 Quartz Debug(需要免费开发者帐户)

    Quartz Debug 可以告诉您任何窗口的级别,您所需要做的就是将您的窗口设置为高于您遇到问题的那个(假设有问题的应用程序没有做一些奇怪的事情来全屏显示)。

    【讨论】:

    • 谢谢,但它不起作用。全屏应用程序在我的窗口前面:(有什么想法吗?
    • @boompa 显然首先要尝试的是使用手动超高值,例如 9999。我将使用 QuartzDebug 更新我的答案。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2016-07-12
    • 2012-06-09
    • 2011-09-03
    相关资源
    最近更新 更多