Mac / Cocoa:如何确定窗口的屏幕是否有菜单栏和Dock?

时间:2017-04-20 09:29:44

标签: cocoa fullscreen multiple-monitors mission-control

我第一次尝试提出以下问题时显然出现了问题:

我正在尝试编写一个传统的全屏切换功能,该功能应该在其当前屏幕(监视器)上将窗口置于或退出全屏模式,同时保持其他屏幕的内容不受影响 - 无论空间的配置方式如何。

我已经将它用于“遗留”Spaces模式,其中每个Space都跨越所有连接的屏幕。在这种情况下,主屏幕上只有1个菜单栏和Dock,可以通过[[NSScreen screens] firstObject]获得。因此,我可以做类似

的事情
        if ([nsWin screen] == [[NSScreen screens] firstObject]) {
            m_normalPresOpts = [nsApp presentationOptions];
            [nsApp setPresentationOptions:m_normalPresOpts | NSApplicationPresentationAutoHideMenuBar | NSApplicationPresentationAutoHideDock];
        }

只有当全屏窗口在主屏幕上时才能使Dock和菜单栏自动隐藏。

Apple无法在不重新启动登录会话的情况下切换Spaces设置,因此我甚至不知道当屏幕具有单独的Spaces时上述代码如何工作。我怀疑虽然[[NSScreen screens] firstObject]仍会包含左上角(0,0)的屏幕,因此其他屏幕上的全屏窗口将继续显示菜单栏和Dock。此外,我仍然在运行10.9,并且也希望立即为以后的版本做到这一点。

有没有办法确定以编程方式如何配置Spaces或知道给定的屏幕是否包含menubar / Dock?谷歌搜索没有给我任何与代码相关的结果。不知怎的,我错过了我的磁盘文档[NSScreen +screensHaveSeparateSpaces],这是我问题的最终答案吗?

2 个答案:

答案 0 :(得分:1)

  

有没有办法以编程方式确定空间的配置方式或知道给定的屏幕是否包含菜单栏/ Dock?谷歌搜索没有给我任何与代码相关的结果。不知怎的,我错过了我的磁盘文档中的[NSScreen + screensHaveSeparateSpaces],这是我问题的最终答案吗?

顺便说一句,如果你的文档已经过时,你可能已经错过了它,因为这个方法是作为新空间模型的一部分引入的,没有记录 - 它只存在于头文件中。在当时和现在之间的某个时刻,文件已经赶上了。

答案 1 :(得分:1)

NSScreen有两个属性

  

这是当前分辨率的全屏矩形。此矩形包括菜单栏和停靠栏当前占用的任何空间。

  

visibleFrame

这是一个矩形,用于定义屏幕中可以安全绘制应用程序内容的部分。

返回的矩形始终基于当前的用户界面设置,不包括Dock和菜单栏当前占用的区域。因为它基于当前的用户界面设置,所以返回的矩形可以在调用之间更改,不应该缓存。

即使启用了Dock隐藏,此方法返回的矩形也可能小于整个屏幕。系统使用较小的边界区域来确定何时应显示停靠点。

    Selection.ShapeRange.IncrementRotation 90
    ActiveSheet.Shapes.Range(Array("Textbox 1", "Chart 1")).Select
    ActiveSheet.Shapes("Textbox 1").Align msoAlignTops, msoFalse
    ActiveSheet.Shapes("Textbox 1").Align msoAlignRights, msoFalse