在系统范围内自动隐藏OS X菜单栏

时间:2009-10-11 18:56:06

标签: objective-c cocoa macos code-injection

我希望编写一个实用程序来自动隐藏菜单栏,就像Dock一样。这个会 复制一个仅限OS X 10.4的应用程序“Menufela”,但对于Snow Leopard。

[[NSApplication sharedApplication]
     setPresentationOptions:   NSApplicationPresentationAutoHideMenuBar
                             | NSApplicationPresentationAutoHideDock];

此代码自动隐藏菜单栏(和停靠栏),但仅限于应用程序是最前面的窗口时。无论打开什么应用程序,我将如何在系统范围内应用此行为?

我唯一能想到的是一个InputManager,但我之前没有写过,所以我不确定这是否是正确的方法..

从Le {/ 3}}开始,似乎InputManagers受限于Leopard / Snow Leopard:

  

它不会在root或whell拥有的进程中运行它们,也不会在已修改其uid的进程中运行它们。最重要的是,10.5不会将输入管理器加载到64位进程中,并且表示即使32位使用也不受支持,将在以后的版本中删除。

我并不担心“将来会在版本中删除”(它只需要在Snow Leopard上运行),我不认为root拥有的进程是一个问题(所有GUI应用程序都应该运行)作为当前的),但可能必须将代码注入许多64位应用程序(Finder / Safari / etc)

(我最初在SuperUser this SO question上问过这个问题,但是因为似乎没有现成的实用工具来实现这一点,所以它与StackOverflow更相关)

4 个答案:

答案 0 :(得分:2)

自助服务终端API可能是您最好的选择,虽然我多年没有使用它,也不知道它是否已经被支持了。

http://developer.apple.com/mac/library/technotes/tn2002/tn2062.html

答案 1 :(得分:2)

我乱砍了一个小的SIMBL插件来隐藏菜单栏:http://github.com/Crazor/MenuBarHider 它使用SetSystemUIMode()Carbon调用,不仅限于32位应用程序。

答案 2 :(得分:1)

我自己没有在Snow Leopard上使用过它,但据我所知,注入系统范围的唯一方法就是mach_star,即使这样也有点棘手。 Apple现在并没有这么容易,这就是为什么很多旧的黑客都无法及时更新或者根本没有更新。

答案 3 :(得分:1)

最近的Cocoa With Love文章提供了有关如何隐藏菜单栏的信息:

http://cocoawithlove.com/2009/08/animating-window-to-fullscreen-on-mac.html

但是,使用CarbonAPI(SetSystemUIMode())要求应用程序为32位,并且不适用于应用程序范围。

编辑:并且进一步阅读,似乎此API不执行-[NSApplication setPresentationOptions]无法执行的任何操作。