以编程方式修改osx中的屏幕边界

Posted

技术标签:

【中文标题】以编程方式修改osx中的屏幕边界【英文标题】:Modifying screen bounds in osx programmatically 【发布时间】:2013-08-24 10:30:39 【问题描述】:

我有一个替换原始 osx 桌面的应用程序。我需要在我的桌面替换中实现一个信息栏,以便它始终可见(有点像 mac 菜单栏)。所以我想知道...

有没有办法以某种方式将 mac 的菜单栏向下移动 20 像素? 有没有办法以某种方式将 mac 的扩展坞移动几个像素?

这样我就可以在桌面的顶部或底部实现信息。我不认为这是可能的,但如果有人知道任何解决方案(applescript 或某些应用程序或最好是objective-c,我非常乐意听到它。

谢谢

【问题讨论】:

所以您的应用程序将在桌面上运行?为什么不直接隐藏文档,然后让你的应用占据整个屏幕呢?还是让应用以全屏模式启动? @Josh 的主要想法是有一个应用程序可以显示信息,无论我现在使用什么应用程序,我都可以看到这些信息(就像停靠栏和菜单栏始终可见) .基本上我想要的是一个其他应用程序窗口永远无法覆盖的额外的类似工具栏的应用程序。我希望这能澄清一些事情。 看看我的回答 【参考方案1】:

我不知道移动 Dock 或菜单栏的简单方法。但是你能不能让你的应用程序成为一个始终保持在前面的浮动窗口?这在 Cocoa 中很容易做到,如下所示:

myWindow.level = NSFloatingWindowLevel;

(假设您已经创建了一个名为 myWindowNSWindow *。)

除了移动其他 UI 元素之外,您是否可以将该窗口锚定在屏幕的左侧或右侧? (假设您的 Dock 位于底部——尽管请注意,如果您将应用分发给其他人,它可能并不总是……例如,我的位于左侧。)

也许我遗漏了一些关于你想做的事情,但对我来说,将你自己的信息栏锚定在其他地方似乎更容易一些,而不是尝试在核心 Mac UI 元素中移动。

【讨论】:

马特,谢谢你的回答。但是,如果我将我的栏固定在任何地方,其他应用程序界面仍然可以移动到该栏后面。这会干扰其他应用程序的功能。我不仅想将我的栏固定在某个地方,而且还想让该区域对任何其他应用程序都不可用(比如你不能在菜单栏后面移动任何东西或在 Dock 后面调整任何东西的大小),这样我的栏就永远不会打开任何应用程序窗口的顶部。但我认为这是不可能的。 @Marius 是的,我不确定您解决该问题的确切方法。我自己对 Cocoa 开发人员比较陌生,所以我没有很多答案,但我知道 NSScreen-visibleFrame 方法返回屏幕的可用区域,减去 Dock 区域和菜单栏。我假设这是系统用来防止其他窗口等进入这些区域的方法?如果这是正确的,您可能会考虑“混合”-visibleFrame 方法。我刚刚开始自己​​阅读,但也许它会起作用?或者这太麻烦了…… 是的,在进入这个论坛之前我也读过它;] 不幸的是,你只能读取屏幕的活动区域,但不能设置它:( 这就是我建议“混合”该方法的原因。这意味着您将操作系统的内置方法替换为您编写的方法。因此,当其他应用程序调用 -visibleFrame 并返回比操作系统返回的稍小的矩形时,您的代码可以跳转。如果您可以避免使用混杂系统方法,通常不会被认为是一种很好的做法,因为如果您没有完全正确地执行它,它可能会导致大量错误和意外行为......但是如果您尝试修改系统的行为以其他应用程序,有时它是唯一的方法,只要负责任地和最低限度地使用它就可以了。 如果您想了解更多信息,请查看 SIMBL 框架。我自己没有使用过它,因为我还没有强烈的需要做任何这样的混合,但如果你想做这样的事情,似乎每个人都建议这样做。让您不必重新发明***,并且更容易成功地进行调酒 - 做对有点棘手,但我听说 SIMBL 会为您处理一些较难的部分。【参考方案2】:

您正在考虑的是类似于modal window 的东西,它将始终保持在最前面(直到它被处理)。但是,模态窗口(如密码提示)令人讨厌,可能不是您想要的。

如果您想要一个“类似菜单栏”的应用程序,为什么要重新发明***?为什么不直接创建一个 Menu Bar Application。菜单栏应用程序在菜单栏中运行,并且可以在那里显示信息,例如您的时钟、电池百分比、cpu 使用情况、wifi 等,并且似乎正是您所需要的。点击后,他们可以在下拉菜单中为用户提供无数选项和更多信息。

【讨论】:

乔希,我不需要重新发明***,因为我不需要菜单栏应用程序。我的应用程序会显示大量信息,但菜单栏中没有足够的可用空间来执行此操作。而且我需要一次显示所有信息,而不需要任何滚动或任何东西。不幸的是,模态窗口也不是我想要的。甚至 [NSWindow setLevel] 也不能用于此目的。

以上是关于以编程方式修改osx中的屏幕边界的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 XIB 视图添加到具有边界的视图控制器 - 不居中

如何以编程方式设置内容类型?获取 org.jvnet.mimepull.MIMEParsingException:缺少开始边界

如何使以编程方式生成的子视图符合超级视图(iOS)的边界?

Netty——网络编程 NIO(Selector处理read事件 消息边界问题)代码示例

在 Mac OSX 中以编程方式阻止屏幕保护程序

如何设置场景物理主体的边界以正确反弹?