10

你们都知道 Mac OS X 中的菜单栏(或者更好的说法是 NSStatusBar)。
有些项目我可以移动,而另一些则不能。

我希望能够拖动我的应用程序的 NSStatusItem。

知道如何实现吗?

4

3 回答 3

20

尽管 NSStatusItems 出现在 Apple 的内部“菜单附加项”附近,但它们是不同的并且行为不同。如果 Apple 统一了可以出现在菜单栏右侧区域的项目,那就太好了,但现在该部分分为不同的“苹果内部”(右侧)和“应用程序提供的(NSStatusItem) “ 在左侧。

您可以通过将计算机置于屏幕捕获模式 (cmd-shift-4) 并按空格键切换到“捕获整个窗口”来可视化区别。当您将鼠标悬停在 Apple 的菜单图标上时,您会看到它们都位于一个窗口中。这解释了它们易于管理和拖拉的能力。将鼠标悬停在其他项目上表明每个 NSStatusItem 实际上都存在于它自己的单个窗口中(恰好由安装它的应用程序拥有)。

最好坚持使用 NSStatusItem,即使你不能拖动它们。这是 Apple 的一个缺点,大多数用户都会理解,即使它很烦人。强调长期提供更稳定的应用程序的积极权衡通常会软化推动可拖动性的客户(或经理?)的意见。

于 2009-03-08T17:58:14.123 回答
14

您必须使用NSMenuExtra, notNSStatusItem并使菜单项成为在SystemUIServer进程内运行的包,而不是您自己的应用程序。您还需要类似 MenuCracker 提供的代码才能使其工作。

NSMenuExtra未记录且不受支持,因此被视为“黑客”。

我猜测首先有两个 API:一个菜单额外崩溃(或内存泄漏)意味着整个 SystemUIServer 进程崩溃或内存泄漏——包括其他第三方模块以及系统提供的模块。另一方面,对于状态项,这样的问题只会影响您自己的代码。

于 2009-03-08T16:52:34.047 回答
1

自 macOS Sierra 10.12 起http://www.macworld.co.uk/how-to/mac-software/7-sierra-menu-bar-tips-how-use-mac-menu-bar-in-macos-sierra -3649163/

第三方应用程序有时会安装为附加菜单,在菜单栏中具有控件,或者尽管最初并非如此,但可以作为匿名应用程序重新启动。从 macOS Sierra 开始,这些菜单附加功能可以像原生菜单一样重新排列。(直到 OS X El Capitan 都不是这种情况。)

于 2017-06-29T09:05:20.567 回答