如何强迫NSWindow在每个应用程序前面?甚至是全屏应用

时间:2012-06-05 21:11:58

标签: objective-c xcode macos cocoa nswindow

我有一个NSWindow我希望在所有内容之前(计算机的每个应用程序,全屏应用程序等等)。即使我在后台应用中点击,NSWindow也无法转到后台。例如,如果用户将桌面切换到desktop2,则NSWindow必须遵循用户界面,依此类推...... 我怎么能这样做? 谢谢!

3 个答案:

答案 0 :(得分:10)

如果你不需要在其他应用程序的全屏窗口中看到它,那就不太难了。

首先,要保持在其他所有方面,只需使用setLevel:使用NSFloatingWindowLevel或更高版本。尝试使用不同的值来查看哪些值符合您的需求。

接下来,即使用户更改Spaces(可能包括Exposé/ Mission Control,setCollectionBehavior :)和适当的标记对,或者如果您正在创建笔尖中的窗口。无论是加入所有空间还是移动到活动空间都可以确保您以不同的方式在每个空间中保持可见。您可能希望Exposé设置为固定,或者也可能是Transient。再次尝试两种方式,看看。

但是,当用户切换到全屏空间或仪表板或启动板时,Lion将隐藏所有空间和移动到活动空间窗口。如果你观察,你会发现它对三种情况中的每一种都以不同的方式做到这一点。 Snow Leopard的做法有所不同,Mountain Lion也是如此。

如果你想解决最后一个问题,你需要为每个案例和每个操作系统版本提供一些hackery和不同形式的hackery。基本的技巧是捕捉与隐藏相关的通知,并在适当的时候取消隐藏。

答案 1 :(得分:4)

您应修改info.plist并将Application is Agent标志设置为YES。代理商的窗口可以显示在全屏窗口的前面。

答案 2 :(得分:0)

同时设置两者, info.plist中的“应用程序是代理程序(UIElement)”到“是”

& 窗口级别:

self.view.window?.level = NSWindow.Level(rawValue: kCGMainMenuWindowLevel.hashValue - 1)
self.view.window?.collectionBehavior = [.stationary, .canJoinAllSpaces, .fullScreenAuxiliary]

帮助了我。