50

我正在寻找编写 Mac OS X Finder 插件的指南或示例代码?它想知道如何做一些简单的动作:

  1. 将图像叠加层添加到图标
  2. 添加上下文菜单项
  3. 监听文件变化

我找到了以下两个资源:

我很想查看SCPlugin代码,但希望找到一个更容易消化的示例。

4

8 回答 8

28

Finder Icon Overlay示例项目代表了以下答案的一个小而非常基本但实际有效的示例。

https://github.com/lesnie/Finder-Icon-Overlay

我知道这已经很老了,但有些人可能仍然对主题感兴趣(?)

这是我在 Leopard (10.6) 下所做的。首先需要适当的 Finder 标题。使用类转储工具来获取它。然后将您的代码编写为 SIMBL 插件(请参阅文档如何操作),混合一些方法。例如,要在 ListView 中的图标上绘制一些东西,必须重写 TIconAndTextCell 方法的 drawIconWithFrame: 方法。

这是方法混合的代码:

+ (void) Plugin_load
{
    Method old, new;
    Class self_class = [self class];
    Class finder_class = [objc_getClass("TIconAndTextCell") class];

    class_addMethod(finder_class, @selector(FT_drawIconWithFrame:),
                    class_getMethodImplementation(self_class, @selector(FT_drawIconWithFrame:)),"v@:{CGRect={CGPoint=dd}{CGSize=dd}}");

    old = class_getInstanceMethod(finder_class, @selector(drawIconWithFrame:));
    new = class_getInstanceMethod(finder_class, @selector(FT_drawIconWithFrame:));
    method_exchangeImplementations(old, new);

}

我用我的方法“FT_drawIconWithFrame:”覆盖了“drawIconWithFrame:”方法。下面是此方法的示例实现。

- (void) FT_drawIconWithFrame:(struct CGRect)arg1
{
    [self FT_drawIconWithFrame:arg1];
    if ([self respondsToSelector:@selector(node)]) {
        if ([[[[NSClassFromString(@"FINode") nodeWithFENode:[(TNodeIconAndNameCell *)self node]] fullPath] lastPathComponent] hasPrefix:@"A"])
            [myPrettyIconOverlayImage drawInRect:NSMakeRect(arg1.origin.x, arg1.origin.y, arg1.size.height, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    }
}

本质上,它在文件名以字母“A”开头的文件的每个图标上绘制“myPrettyIconOverlayImage”。这个逻辑取决于你。

注意这一行:[self FT_drawIconWithFrame:arg1];这是如何调用“super”以获得正常的图标和名称等。我知道,看起来很奇怪,像循环,但实际上不是。然后封装到 SIMBL 插件中,安装 SIMBL 并...运行。

由于 Lion 的变化,一些工作必须从头开始(制作新的“Finder.h”文件,其中包含所需的所有声明,找到合适的类和方法来覆盖),但这种技术仍然有效。

快乐黑客!

于 2012-01-09T00:00:29.967 回答
26

对于 Yosemite(MacOS 10.10 及更新版本),您可以使用 Apple 的FinderSync 框架,它允许 Finder 扩展:

  • 表达对特定文件夹层次结构的兴趣
  • 提供“徽章”以指示这些层次结构中项目的状态
  • 当所选项目(或窗口目标)位于这些层次结构中时,在 Finder 上下文菜单中提供动态菜单项
  • 提供一个显示带有动态项的菜单的工具栏项(即使选择不相关)
于 2015-01-29T06:00:30.587 回答
18

可悲的是,编写一个 Finder 插件实际上仍然需要亲自动手使用 COM。如果您查看 SCPlugin 项目的 SCFinderPlugin 子项目,您会发现它与第一个链接中概述的技术完全相同,包括为 COM 设置 vtable、编写 AddRef/ReleaseRef 函数等。编写一个插件,同时管理老式的 Carbon 内存管理、COM 风格的内存管理和 Cocoa/新型 Carbon 内存管理,这可能是一个令人难以置信的痛苦——这完全忽略了这样一个事实:在三个或更多完全不同的 API 中进行交互,具有不同的命名约定和调用语义。将这种情况称为歇斯底里地糟糕将是一种轻描淡写的说法。

好的一面是,Mac OS X 10.6 Snow Leopard 中的 Finder 已经用 Cocoa 完全重写——随之而来的是非常出色的插件界面。如果你幸运地遇到了实际上只能以雪豹为目标的情况,你可能应该获得 ADC Premier 或更高级别的会员资格,下载预发布版本,并针对它编写代码。此外,如果没有 Cocoa 重写,您的插件可能无法在 10.6 上运行,因此无论如何,在 Snow Leopard 发布之前看一下它可能是有意义的。

于 2009-08-18T15:01:40.633 回答
15

Finder 没有官方或受支持的插件系统。从 OS X 10.6 开始,您需要将代码注入 Finder 进程并覆盖 Finder 进程中的目标 C 方法。

我已经为一个专有项目做到了这一点。我可以告诉你,没有示例或教程的原因是因为它是一项非常困难且耗时的开发任务。出于这个原因,对于已完成此任务的个人或组织来说,有足够的动力来密切保护其流程的细节。

如果有任何方法可以使用服务 API 实现您的目标,那就去做吧。编写一个 Finder 插件将花费你 1-2月的艰苦开发和相当深入的 C 和 Objective-C 内部知识。

如果您仍然确信要这样做,请抓住mach_star。祝你好运。

于 2010-10-15T21:33:36.877 回答
2

据我所知,Finder 没有官方的插件架构。您可以通过外部应用程序向图标添加图像覆盖,而无需连接到 Finder,尽管它不会即时运行。我认为除了文件夹操作和 Automator 之外,没有其他方法可以添加上下文菜单项。您还可以考虑使用FSEvents API编写外部应用程序来监视文件系统更改。

于 2009-08-18T15:18:48.010 回答
2

这是使用 Les Nie 描述的技术在 Lion 和 Mountain Lion 中的 Finder 图标徽章和上下文菜单的完整解决方案。

Liferay Nativity提供了一个脚本包,它将调动相关的 Finder 方法和一个用于设置图标和上下文菜单的 Java 客户端。它还包括适用于 Windows 和 Linux 的等效项目。

该项目是 LGPL 下的开源项目,因此请随时贡献任何错误修复或改进!

于 2013-07-30T18:18:16.347 回答
1

采摘物很少;我一直不清楚是否真的支持 Finder 插件。不过,还有一些线索:

  • SampleCMPlugIn - 当然是基于碳的,因为 Finder 也是如此。请注意,几乎所有 Finder 插件都可能会停止使用 10.6。
  • Automator 可以将内容保存为“Finder 插件”。这是您正在讨论的内容的更受支持的版本,但当然不太灵活。
于 2009-08-18T15:00:47.967 回答
0

要从 Java 以跨平台方式添加 Finder/File 浏览器图标覆盖和上下文菜单,请查看Liferay Nativity库。

我还在另一篇 SO 帖子中提到了这一点,该帖子还包含指向 Apple 的“Finder Sync”文档和 API 的链接。

于 2016-02-19T03:03:48.400 回答