我正在寻找一个指南或示例代码来编写插件?它想知道如何做一些简单的操作:
我发现了以下两种资源:
COM
API的过时文档。我很想回顾一下SCPlugin
代码,但希望找到一个更容易消化的示例。
发布于 2009-08-18 15:01:40
可悲的是,开发一个Finder插件实际上仍然需要用COM来弄脏你的手。如果查看SCFinderPlugin项目的SCPlugin子项目,您会发现它遵循了第一个链接中概述的完全相同的技术,包括为COM设置vtable、编写AddRef/ReleaseRef函数等等。编写一个插件,你可以同时管理旧的碳存储管理,COM风格的内存管理,和Cocoa/新风格的碳存储管理,这可能是一个令人难以置信的痛苦--而这完全忽略了这样一个事实,即您将在三个或更多完全不同的API中交互,它们具有不同的命名约定和调用语义。如果把这种情况说得歇斯底里地贫穷,那将是一种巨大的低估。
好的一面是,MacOSX10.6雪豹中的Finder已经用Cocoa完全重写了--随之而来的是非常优秀的插件界面。如果您足够幸运地处于这样一种情况下,您实际上只能针对雪豹,您可能应该获得一个ADC总理或更高的成员,下载预发布的构建,并对此进行编码。此外,如果没有Cocoa重写的话,你的插件在10.6上可能无法工作,所以在雪豹发布之前看一看可能是很有意义的。
发布于 2012-01-09 00:00:29
查找图标覆盖示例项目代表了下面答案的一个小的、非常基本的但实际工作的示例。
https://github.com/lesnie/Finder-Icon-Overlay
我知道这很古老,但有些人可能还对话题(?)感兴趣。
以下是我在豹(10.6)下所做的工作。一开始,需要适当的查找头。使用类转储工具来获得它。然后以SIMBL插件的形式编写代码(参见文档如何实现),并对一些方法进行了修改。例如,要在ListView中的图标上绘制一些东西,必须覆盖drawIconWithFrame: TIconAndTextCell方法的方法。
下面是方法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);
}
我用我的方法"drawIconWithFrame:“重写"FT_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];
--这是如何调用'super‘来获得正常的图标和名称等等。我知道,看起来很奇怪,像循环,但实际上不是。然后包装到SIMBL插件中,安装SIMBL和...run。
由于Lion中的一些更改,有些工作必须从头开始(使用其中所需的所有声明创建新的"Finder.h“文件,找到适当的类和方法来覆盖),但是这种技术仍然有效。
黑客行动愉快!
发布于 2015-01-29 06:00:30
对于约塞米蒂(MacOS 10.10和更新版本),您可以使用苹果的FinderSync框架,它允许Finder扩展:
https://stackoverflow.com/questions/1294335
复制相似问题