如何编写OS X Finder插件

not*_*oop 47 macos plugins cocoa finder objective-c

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

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

我找到了以下两个资源:

我很想检查SCPlugin代码,但希望找到一个更容易消化的样本.

Les*_*Nie 28

Finder图标叠加例如项目代表了下面的答案的小,非常基本的,但实际工作的例子.

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

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

以下是我在Leopard(10.6)下完成的工作.首先需要适当的Finder标头.使用类转储工具来获取它.然后将您的代码编写为SIMBL插件(请参阅文档如何操作),调整一些方法.例如,要在ListView中绘制一些图标,必须覆盖drawconMith方法的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);

}
Run Code Online (Sandbox Code Playgroud)

我用我的方法"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];
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上它会在文件的每个图标上绘制"myPrettyIconOverlayImage",文件名以字母"A"开头.这个逻辑取决于你.

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

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

快乐的黑客!

  • 是的,可能.然而,这是您在Finder中实现此类功能(图标叠加)的唯一方法.这可能是Dropbox在AppStore中无效的原因. (4认同)
  • 好吧,由于我提出了很多要求,我写的很小但非常基本但实际上是工作的例子 这是[link](https://github.com/lesnie/Finder-Icon-Overlay).再次:hapy hacking! (3认同)

Mic*_*ann 24

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

  • 表达对特定文件夹层次结构的兴趣
  • 提供"徽章"以指示这些层次结构中的项目状态
  • 当所选项目(或窗口目标)位于这些层次结构中时,在Finder上下文菜单中提供动态菜单项
  • 提供工具栏项目,显示包含动态项目的菜单(即使选择不相关)


Ben*_*ack 18

可悲的是,编程搜索插件实际上确实仍然需要得到你的手脏与COM.如果你查看SCPlugin项目的SCFinderPlugin子项目,你会发现它遵循第一个链接中概述的完全相同的技术,包括为COM设置vtable,编写AddRef/ReleaseRef函数等等.编写插件,同时管理老式碳内存管理,COM式内存管理和Cocoa /新式碳内存管理,可能是一种难以置信的痛苦 - 而且完全忽略了这样一个事实:你将是在三个或更多完全不同的API中进行交互,具有不同的命名约定和调用语义.把这种情况称为歇斯底里的穷人将是一个巨大的轻描淡写.

从好的方面来说,Mac OS X 10.6 Snow Leopard中的Finder已经在Cocoa中完全重写 - 并且随之而来的是更优秀的插件接口.如果你很幸运能够实际上只能实现Snow Leopard的目标,那么你可能应该获得ADC Premier或更高级别的会员资格,下载预发布版本以及代码.此外,如果没有Cocoa重写,你的插件可能无法在10.6上运行,因此在它被释放之前看看Snow Leopard可能是很有意义的.


ant*_*ony 14

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

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

如果有任何方法可以使用Services API完成目标,那就去做吧.编写一个Finder插件会带你1-2 坚实的潜心研发和C的合理深刻的认识和Objective-C的内部的几个月.

如果你仍然相信你想要做到这一点,抓住mach_star.祝好运.