如何编写OS X Finder插件

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

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

我发现了以下两个资源:

  • 为OS X编写上下文菜单插件 :来自2002年的过时文档,使用面向Mac OS X 8/9的COM API。
  • SCPlugin :包含Finder插件的开源SVN Mac应用程序。

我很想回顾一下SCPlugin代码,但是希望find一个更容易被消化的样本。

不幸的是,编程一个Finder插件实际上仍然需要把你的手弄脏COM。 如果您查看SCPlugin项目的SCFinderPlugin子项目,您会发现它遵循与第一个链接中概述的相同的技术,包括为COM创build一个vtable,编写AddRef / ReleaseRef函数等等。 编写一个插件,在那里你同时pipe理老式的碳内存pipe理,COM风格的内存pipe理,和cocoa/新型碳内存pipe理,可以是一个令人难以置信的痛苦,而这完全忽略了你将会在三个或更多完全不同的API中进行交互,具有不同的命名约定和调用语义。 把这个歇斯底里的情况称为穷人将是一个很大的轻描淡写。

好的一面是,Mac OS X 10.6 Snow Leopard中的Finder已经在Cocoa中完全重写了,而且这个插件的界面非常优秀。 如果你足够幸运的话,你可能只能瞄准雪豹,你可能应该抓住一个ADC总理或更高级别的成员,下载预发布版本,并编写代码。 另外,如果没有Cocoa重写,那么你的插件可能无法在10.6上运行,所以不pipe怎么说,看看Snow Leopard发布之前看看是否合适。

Finder Icon Overlay示例项目代表了一个小而非常基本但是实际工作的答案。

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

我知道这是如此之旧,但有些人可能仍然对话题感兴趣(?)

这是我在Leopard(10.6)下完成的。 起初需要正确的Finder标题。 使用类转储工具来获取它。 然后把你的代码写成一个SIMBL插件(参考文档如何做),调整一些方法。 比如要在ListView的图标上画一些东西,drawIconWithFrame:TIconAndTextCell方法的方法必须被overriden。

这里是方法swizzling的代码:

 + (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]; } } 

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

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

由于狮子的变化,一些工作必须从头开始(创build新的“Finder.h”文件,其中包含所有需要的声明,find适当的分类和方法来覆盖),但是这种技术仍然有效。

快乐的黑客!

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

  • expression对特定文件夹层次结构的兴趣
  • 提供“徽章”来表明这些层级内的物品的状态
  • 在Finder上下文菜单中提供dynamic菜单项,当选定的项目(或窗口目标)在这些层次结构中时
  • 提供一个工具栏项目,显示带有dynamic项目的菜单(即使select不相关)

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

我已经做了一个专有的项目。 我可以告诉你,没有例子或教程的原因是因为这是一个非常困难和耗时的开发任务。 出于这个原因,对于完成这个过程的个人或组织来说,有很大的动力来密切关注他们的过程的细节。

如果有任何方法可以使用Services API来实现您的目标,请执行此操作。 编写一个Finder插件将需要1-2个坚实的月份,艰苦的开发和对C和Objective-C内部知识的深入了解。

如果你仍然相信你想要这样做,抓住mach_star 。 祝你好运。

据我所知,Finder没有官方的插件架构。 您可能可以通过外部应用程序添加图像叠加到图标,而无需挂钩到Finder,虽然它不会在飞行中。 我不认为有一种方法可以添加文件夹操作和Automator之外的上下文菜单项。 您还可以考虑编写外部应用程序来使用FSEvents API监视文件系统更改。

这里有一个完整的解决scheme,使用Les Nie所描述的技术来完成Lion和Mountain Lion中的Finder图标徽章和上下文菜单。

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

该项目是LGPL下的开源软件,所以请随时提供任何错误修复或改进!

采摘是苗条的; Finder插件实际上是否支持,从来没有真正清楚过。 不过,还有几条线索:

  • SampleCMPlugIn – 当然是基于Carbon的,因为Finder也是如此。 请注意,几乎所有的Finder插件可能会停止使用10.6。
  • Automator可以保存为“Finder插件”。 这是您正在讨论的更支持的版本,但当然不太灵活。

要以跨平台的方式从Java中添加查找器/文件浏览器图标叠加层和上下文菜单,请查看Liferay Nativity库。

我还在另一个SOpost中提到了这个,它也包含了苹果的“Finder Sync”文档和API的链接。