【问题标题】:NSStatusItem menu does not show up in lion full screen appNSStatusItem 菜单未显示在狮子全屏应用程序中
【发布时间】:2011-11-01 16:44:07
【问题描述】:

我有一个显示NSStatusItem 和菜单的前台应用程序(通过NSStatusItem setMenu:(NSMenu *)menu)。但是,当我在 Lion 中以全屏模式(比如 Safari)查看另一个应用程序时,此菜单不会显示。

我知道我可以通过在 Info.plist 文件(或 NSUIElement)中将 NSBGOnly 设置为 true 来使其工作,但这两种方法都会使我的应用程序图标从任务切换器中消失并隐藏主一旦我设法集中我的应用程序的菜单。

最后,我尝试将NSUIElement 设置为true,并在启动时在我的应用程序中执行以下操作(另请参阅How to hide the Dock icon):

ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);

这使得菜单栏和停靠图标再次出现,但原始问题(状态项菜单未显示在另一个全屏应用程序中)再次可见。不管我怎么努力,我都赢不了。

任何建议将不胜感激!

【问题讨论】:

    标签: cocoa osx-lion macos


    【解决方案1】:

    不幸的是,我认为这是预期的行为。您的应用程序被视为前台应用程序,因此当另一个应用程序处于全屏状态时,它的所有 UI 都将被禁用。如果您认为前台应用程序中的状态项在全屏模式下仍应可供其他应用程序使用,则应提交错误。

    可能最好的解决方案是将您的应用程序分成两部分,一个将 LSUIElement 设置为 true 的代理应用程序,它创建和管理状态项及其菜单,而您的主前台应用程序执行大部分工作并启动和管理代理应用程序。

    您可以使用多种进程间通信方法让两个应用相互通信,例如 Distributed Objects 或 Apple Events。

    【讨论】:

    • 谢谢,我担心会是这样。有没有办法将这两个对象打包到一个 .app 文件中?否则,如果用户需要将 2 个 .apps 拖到他的应用程序文件夹或创建 .pkg 文件,那就太糟糕了。
    • 是的,您绝对可以在主应用程序包装器中存储一个辅助工具。本质上,您会将代理应用程序构建为自己的目标,然后使用 Xcode 中的 Copy Files 构建阶段将其复制到主应用程序包的 AppPackage.app/Contents/Resources 文件夹中。
    • Dropbox 应用程序似乎运行良好。还会显示系统的托盘菜单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2012-01-02
    • 2013-06-19
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多