在 OS X 的停靠栏上下文菜单中显示图标?

Posted

技术标签:

【中文标题】在 OS X 的停靠栏上下文菜单中显示图标?【英文标题】:Show icons in the dock contextual menus in OS X? 【发布时间】:2012-07-08 03:11:32 【问题描述】:

我的问题很简单:

要为 Dock 上的应用程序图标使用自定义菜单,NSApplicationDelegate 中的 - (NSMenu*) applicationDockMenu: (id) sender; 必须返回 Dock 将显示的菜单。

NSMenuItem 上使用setImage,您通常可以将图标添加到菜单中。它们显示在普通菜单上,但不在应用程序停靠图标的上下文菜单中。

那么,Apple 是如何管理 QuickTime、XCode、Preview 以在其停靠上下文菜单中可访问的最近打开文件列表中显示图标?

谢谢。

【问题讨论】:

【参考方案1】:

最近文件列表实际上是标准 Dock 图标菜单的一部分。要在您的应用程序中使用它,您应该构建一个基于NSDocument 的应用程序。通过使用NSDocument,您将免费获得最近的文件菜单/行为。

如果您的应用程序不能基于NSDocument,您可以指示 Cocoa 维护基于 URL 的最近文档列表:

NSDocumentController *docController = [NSDocumentController sharedDocumentController];
[docController noteNewRecentDocumentURL:locationOfMyRecentFile1];
[docController noteNewRecentDocumentURL:locationOfMyRecentFile2];
[docController noteNewRecentDocumentURL:locationOfMyRecentFile3];

请注意,目前,-noteNewRecentDocumentURL: 仅支持 file:// URL(您可以从带有 +[NSURL fileURLWithPath:] 的路径创建。)将来,它的行为可能会改变以允许使用其他方案的 URL。

【讨论】:

【参考方案2】:

以下是我的理解,部分是推测性的,与实现细节有关:

Dock 在单独的进程中运行,您不能将任意NSImage 从应用程序的进程边界随意传递到 Dock。只有两种图像可以正确传递:标准系统图标和资源包中的图标。但我不认为NSImage 做了必要的咒语来使这两种方法起作用。

So you're going to have to use Carbon. 具体来说,您需要将SetMenuItemIconHandlekMenuSystemIconSelectorType(涵盖Carbon IconRefs,通过GetIconRef 获得)或kMenuIconResourceTypeCFStrings 引用.icns)一起使用应用程序包的 Resources 文件夹中的文件)。

相关标题为<HIToolbox/MacApplication.h>(用于GetApplicationDockTileMenu)、<HIToolbox/Menus.h>(用于SetMenuItemIconHandle)和<HIServices/Icons.h>,(用于GetIconRef,如果您使用系统图标)。

未经测试,但应该如下所示:

#include <Carbon/Carbon.h>

SetMenuItemIconHandle(
    GetApplicationDockTileMenu(),
    [dockMenu indexOfItem:dockMenuItem],
    kMenuIconResourceType,
    (Handle) CFSTR("icon.icns")
);

可能没这么简单;其中一些可能只有 32 位。

【讨论】:

“不适用于 64 位应用程序。” :( 肯定还有别的,QuickTime、Preview & XCode 都是 64 位应用。 @MatthieuRiegler 这不是NSDocumentController 所做的吗?它可能使用私有的 Apple API。 我不知道。是吗 ?看了之后,它可能是一个私有的 Apple API。我找不到具有这些图标的非 Apple 应用程序。 MS Office 没有什么可... 我注意到 BBEdit 还显示一个包含最近文件的菜单,包括图标,还有其他选项,例如显示 Scratchpad

以上是关于在 OS X 的停靠栏上下文菜单中显示图标?的主要内容,如果未能解决你的问题,请参考以下文章

Java OS X - 停靠栏中没有应用程序图标[重复]

OS X 停靠图标中的 NSProgressIndicator 显示为灰色,如何制作标准蓝色

应用程序未运行时的 OS X 停靠菜单

带有菜单栏但没有 Dock 图标/切换菜单的 Cocoa 应用程序

如何获取 QToolBar / QDockWidget 上下文菜单操作?

如何在 Mac OS 中显示菜单栏图标 [重复]