首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写插件

如何编写插件
EN

Stack Overflow用户
提问于 2009-08-18 14:40:35
回答 8查看 29.1K关注 0票数 50

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

  1. 向图标添加图像覆盖层
  2. 添加上下文菜单项
  3. 听文件更改

我发现了以下两种资源:

  • 为OS编写上下文菜单插件:从2002年开始使用针对MacOSX8/9的COM API的过时文档。
  • SCPlugin:一个开源的SVN应用程序,包括一个Finder插件.

我很想回顾一下SCPlugin代码,但希望找到一个更容易消化的示例。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 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上可能无法工作,所以在雪豹发布之前看一看可能是很有意义的。

票数 18
EN

Stack Overflow用户

发布于 2012-01-09 00:00:29

查找图标覆盖示例项目代表了下面答案的一个小的、非常基本的但实际工作的示例。

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

我知道这很古老,但有些人可能还对话题(?)感兴趣。

以下是我在豹(10.6)下所做的工作。一开始,需要适当的查找头。使用类转储工具来获得它。然后以SIMBL插件的形式编写代码(参见文档如何实现),并对一些方法进行了修改。例如,要在ListView中的图标上绘制一些东西,必须覆盖drawIconWithFrame: TIconAndTextCell方法的方法。

下面是方法swizzling的代码:

代码语言:javascript
运行
复制
+ (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:”方法。下面是此方法的示例实现。

代码语言:javascript
运行
复制
- (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“文件,找到适当的类和方法来覆盖),但是这种技术仍然有效。

黑客行动愉快!

票数 28
EN

Stack Overflow用户

发布于 2015-01-29 06:00:30

对于约塞米蒂(MacOS 10.10和更新版本),您可以使用苹果的FinderSync框架,它允许Finder扩展:

  • 表示对特定文件夹层次结构的兴趣
  • 提供“徽章”以指示这些层次结构中的项的状态。
  • 在选定项(或窗口目标)处于这些层次结构时,在Finder上下文菜单中提供动态菜单项
  • 提供一个工具栏项,显示带有动态项的菜单(即使所选内容无关)
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1294335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档