- 向图标添加图像叠加
- 添加上下文菜单项
- 监听文件更改
- 为OS X编写上下文菜单插件:这是一份过时的2002年文档,使用COM API针对Mac OS X 8/9。
- SCPlugin:开源SVN Mac应用程序,包括Finder插件。
Finder Icon Overlay示例项目是下面答案的一个很小、非常基础但实际可行的示例。
https://github.com/lesnie/Finder-Icon-Overlay
我知道这已经很老了,但仍有些人可能对此感兴趣。
在Leopard(10.6)下完成需要使用正确Finder的头文件。使用class-dump工具获取它们。然后编写代码作为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”文件,其中包含所有需要的声明,找到要重写的正确的类和方法),但这种技术仍然可以使用。
愉快的黑客活动!FI_TIconAndTextCell
而不是TIconAndTextCell
,但我怀疑我们指的是同一个类。 - Tony针对Yosemite(MacOS 10.10及以上版本),您可以使用苹果的FinderSync框架,该框架允许Finder扩展:
不幸的是,编写Finder插件仍然需要使用COM方法。 如果您查看SCPlugin项目的SCFinderPlugin子项目,您会发现它遵循了第一个链接中概述的完全相同的技术,包括为COM设置vtable,编写AddRef / ReleaseRef函数等。编写插件时,您同时管理老式Carbon内存管理、COM风格的内存管理和Cocoa /新式Carbon内存管理,可能会非常痛苦,完全忽略了您将在三个或更多根本不同的API中进行交互,具有不同的命名约定和调用语义。形容这种情况为极其糟糕绝对是轻描淡写。
好消息是,Mac OS X 10.6 Snow Leopard中的Finder已经完全重写为Cocoa,并且随之而来的是极大改进的插件接口。如果您足够幸运,可以只针对Snow Leopard进行编码,那么您可能应该获取ADC Premier或更高级别的会员资格,下载预发布版本,并对其进行编码。此外,即使没有Cocoa重写,您的插件也可能无法在10.6上工作,因此,在发布之前查看Snow Leopard可能是明智的选择。
Finder没有官方或支持的插件系统。从OS X 10.6开始,您需要向Finder进程中注入代码并覆盖Objective C方法。
我曾经为一个专有项目完成过这个任务。我可以告诉你,之所以没有示例或教程是因为这是一项相当困难和耗时的开发任务。因此,那些已经完成这个任务的个人或组织有充分的动力密切保护他们的具体过程。
如果您能够使用Services API实现目标,请尽可能这样做。编写Finder插件将需要1-2个月的细致开发和相当深入的C和Objective-C内部知识。
如果您仍然坚信要这样做,请获取 mach_star。祝你好运。
选择很少;我从来不确定Finder插件是否得到支持。然而,还有一些线索:
如果您想以跨平台的方式从Java中添加Finder/文件浏览器图标叠加和上下文菜单,请查看Liferay Nativity库。
我还在另一个SO帖子中提到了这一点,其中还包含到苹果的“Finder Sync”文档和API的链接。