代码之家  ›  专栏  ›  技术社区  ›  Brock Woolf

为编写雪豹服务查找程序.app

  •  7
  • Brock Woolf  · 技术社区  · 14 年前

    在Windows上,您可以右键单击,创建新的文本文件。 在OSX上,您应该可以使用这样的服务:

    编写查找程序 Service 理论上讲,雪豹是实现这一点的方法,尽管我还没有找到任何示例代码。(我承认我只是简单地看了一下文档)。

    我不知道如何开始,苹果是否在Xcode中提供服务模板。基本上,我正在寻求帮助,让一个工作服务项目运行。对于我来说,在Obj-C中编写实现代码应该是相当琐碎的。那么我可以做些什么来创建一个新的工作服务项目呢?如果我错了,那么告诉我正确的方法来做这件事,请提供示例代码或一些步骤,让我开始。

    相信我,伙计们,我不是一个无赖。我已经尝试了许多应用程序来实现变通方法:探路者、自动程序、终端等等,但我对它们都不满意。

    我想创建一个右键单击的菜单项来创建新的文件,就像Windows一样。如果这个API不允许我这样做,那么我将在必要时修改系统文件。但我宁愿这样做,不需要我黑客操作系统X。

    是的,Quicksilver是我目前创建文件的方式,除非我在终端中创建文件 touch ~/Desktop/file.txt 或者任何地方。

    如果您不能通过提供Xcode项目的源代码来回答我的问题,请保留您对我应该如何单独使用计算机的意见。不管怎样,我想在我自己去实现这一点之后,我可能会回答我自己的问题。

    1 回复  |  直到 14 年前
        1
  •  14
  •   Yuji    11 年前

    阅读 Services Implementation Guide . 如果您需要工作示例代码,请参阅 this project 我煮的。如指南中所述,您需要做的是安装服务处理程序:

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        [NSApp setServicesProvider:self];
        NSUpdateDynamicServices();
    }
    
    - (void)handleServices:(NSPasteboard *)pboard
              userData:(NSString *)userData 
             error:(NSString **)error {
        if([[pboard types] containsObject:NSFilenamesPboardType]){
            NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType];
                // do something...
        }
    }
    

    在你的网站上登广告 Info.plist :

    <key>NSServices</key>
    <array>
        <dict>
            <key>NSMenuItem</key>
            <dict>
                <key>default</key>
                <string>Service Handling Demo</string>
            </dict>
            <key>NSMessage</key>
            <string>handleServices</string> <!-- This specifies the selector -->
            <key>NSPortName</key>
            <string>services</string>       <!-- This is the name of the app -->
            <key>NSSendTypes</key>
            <array>
                <string>NSFilenamesPboardType</string>
            </array>
        </dict>
    </array>
    

    pbs.plist 里面 Library/Preferences/ ,但这并不是一种有据可查的做事方式。

    问题是,右键单击Finder窗口中的空白区域时,Finder不会显示此服务项。你不能用它做任何事,除了注入代码。这是Finder对服务系统的固有支持。如果你想改变这种行为,你需要在里面注入代码查找程序.app. 没那么难。在雪豹上,使用OSAX加载技巧是标准的。 in this blog post . 然后,您可以使用Objective-C运行时函数通过更改所描述的方法来修补查找器右键单击的行为 in this Apple document . (不过,我不知道Finder使用哪种方法来响应右键单击事件。)

    相反,如果您可以单击Finder窗口工具栏上的按钮而不是右键单击,则可以添加一个按钮,如本实用程序所示 cd-to . 这使用了将应用程序的图标放到Finder工具栏的功能。应用程序本身只是通过appleevents读取最前面的Finder窗口的路径,并为此打开一个终端窗口。我想你可以调整这个应用程序的代码来做你想做的。

    以下是一些主观因素:

    老实说,如果您只想创建一个新文件,就不必使用Objective-C来编写Finder服务。Automator可以用shell脚本和/或Applescript做同样的事情。

    如果你想在Mac上高效地管理文件,已经有很多实用程序:试试看 Butler launchbar Quicksilver