【问题标题】:Cocoa: how to remove item from Finder's context menu via service?Cocoa:如何通过服务从 Finder 的上下文菜单中删除项目?
【发布时间】:2013-07-07 14:52:05
【问题描述】:

我创建了一项服务,以便在 Finder 的上下文菜单中显示一个项目。

我的应用程序中有以下代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [NSApp setServicesProvider:self];
    NSUpdateDynamicServices();
}

我想通过对服务本身的操作从上下文菜单中删除该项目。

我尝试过:

NSUnregisterServicesProvider([[NSBundle mainBundle] bundleIdentifier]);

但它杀死了所有服务几秒钟,当它恢复我的服务时,我的服务位于 Finder 上下文菜单的服务列表中。

如何从查找器的上下文菜单中删除我的 NSService 项?

【问题讨论】:

    标签: objective-c macos cocoa contextmenu finder


    【解决方案1】:

    The documentation says:

    您不应使用此功能取消注册您的应用程序提供的服务。对于您的应用程序的服务,您应该使用 NSApplication 的 setServicesProvider: 方法,传递一个 nil 参数。

    所以,做你在applicationDidFinishLaunching: 中所做的,除了通过nil 而不是self。 (我不知道您是否需要执行NSUpdateDynamicServices 步骤。)

    【讨论】:

    • 通过设置 [NSApp setServicesProvider:nil] Finder 的上下文菜单仍然显示我的新条目,但是它断开了服务,意味着不运行目标方法。如何也从 Finder 的上下文菜单中删除该服务?
    • @Nili:你可能做不到。只要安装了声明它提供此服务的应用程序,该服务就存在并因此被列出。 (可以说,如果您没有服务提供商,它不应该出现,但这是bug report 的问题。)
    • 感谢@Peter 的回答。我将尝试另一种选择:有没有办法通过代码禁用服务可见性,例如当您从“键盘快捷方式”->“服务”选项卡中的首选项中取消选中服务时?这样服务仍然被注册但它没有被呈现......
    • @Nili:AFAIK,没有 API。只有用户可以打开和关闭这些。
    【解决方案2】:

    例如,如果您有一个卸载应用程序,您可以通过以下方式从“服务”菜单中删除您的菜单项:

    1. 删除提供服务的应用程序(您在其中调用 [NSApp setServicesProvider:self] 的应用程序)
    2. 致电NSUpdateDynamicServices()

    它重建数据库并检查应用程序的可用性,注册以提供服务。

    如果没有帮助,请使用/System/Library/CoreServices/pbs -dump_pboard 在终端中转储数据库,然后查找您的服务和为其列出的网址。其他地方可能有该应用程序的另一个副本,并且聪明的系统找到了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-10
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多