代码之家  ›  专栏  ›  技术社区  ›  notnoop

如何编写OSX查找器插件

  •  46
  • notnoop  · 技术社区  · 15 年前

    我正在寻找一个指南或样例代码来编写MacOSX Finder插件?它想知道如何执行一些简单的操作:

    1. 添加上下文菜单项

    我发现了以下两个资源:

    我忍不住要复习一下这本书 SCPlugin

    8 回复  |  直到 15 年前
        1
  •  28
  •   pkamb santoshIOS    10 年前

    Finder Icon Overlay

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

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

    下面是我在Leopard(10.6)下所做的。首先需要合适的查找器标题。使用类转储工具获取它。然后以SIMBL插件的形式编写代码(请参阅如何实现的文档),并使用一些方法。例如,要在ListView中的图标上绘制某些内容,必须覆盖Ticon的drawIconWithFrame:method和TextCell method。

    + (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]; 这是如何调用“超级”以获得正常的图标和名称等。我知道,看起来很奇怪,像循环,但实际上不是。然后封装到SIMBL插件中,安装SIMBL并运行。

    由于Lion中的更改,一些工作必须从头开始(创建新的“Finder.h”文件,其中包含所需的所有声明,找到适当的类和要重写的方法),但这种技术仍然有效。

        2
  •  26
  •   Michael Dorner Satyanarayana    8 年前

    对于约塞米蒂(MacOS 10.10及更新版本),您可以使用苹果的 FinderSync framework ,它允许查找器扩展:

    • 表示对特定文件夹层次结构的兴趣
    • 指示这些层次结构中项目的状态
    • 提供动态 窗口目标)位于这些层次结构中
    • 提供一个工具栏项 显示带有动态项的菜单(即使选择是
        3
  •  18
  •   Benjamin Pollack Stefan Rusek    15 年前

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

        4
  •  15
  •   anthony    14 年前

    我为一个专有项目做了这件事。我可以告诉你,之所以没有这方面的示例或教程,是因为这是一项非常困难和耗时的开发任务。因此,对于已经完成这项工作的个人或组织来说,有足够的动机来密切关注其流程的细节。

    如果有任何方法可以使用服务API实现您的目标,那么就这样做。编写Finder插件需要1-2分钟 数月的艰苦开发和对C和Objective-C内部结构的深入了解。

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

        5
  •  2
  •   Martin Gordon    15 年前

    据我所知,Finder没有官方的插件架构。您可以通过外部应用程序将图像覆盖添加到图标上,而无需连接到Finder,尽管它不会在运行中。我认为除了文件夹操作和自动机之外,没有其他方法可以添加上下文菜单项。您还可以考虑编写一个外部应用程序,使用 FSEvents API .

        6
  •  2
  •   dejuknow    11 年前

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

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

        7
  •  1
  •   Rob Napier    15 年前

    采摘不多;我一直不清楚Finder插件是否得到了支持。不过,还有一些线索:

    • SampleCMPlugIn
    • Automator可以将东西保存为“Finder插件”。它是您正在讨论的更受支持的版本,但当然灵活性较差。
        8
  •  0
  •   Community CDub    8 年前

    Liferay Nativity 图书馆

    我在报告中也提到了这一点 another SO post ,其中还包含指向苹果“Finder Sync”文档和API的链接。