【问题标题】:Cocoa API to set the default app for a file to open withCocoa API 设置打开文件的默认应用程序
【发布时间】:2011-01-12 09:05:59
【问题描述】:

是否有任何 Cocoa 或 Carbon API 来设置打开文件的默认应用程序? 即如果我选择一个文件并执行 Cmd+i,我们会得到一个选项“打开方式”。在这里我们可以设置默认应用打开文件。此外,还有一个选项可以将其应用于所有此类文件。

如何以编程方式实现这两个目标?

【问题讨论】:

    标签: cocoa file default


    【解决方案1】:

    基于每个文件设置应用程序的 API 是私有的。有关设置处理文件类型的应用程序,请参阅启动服务参考中的 LSSetDefaultRoleHandlerForContentType 和其他方法。

    【讨论】:

      【解决方案2】:

      要为文件扩展名(或文件 UTI)设置默认应用程序,请在此处查看我的答案:https://stackoverflow.com/a/8645445/272342

      【讨论】:

        【解决方案3】:

        有一个 Carbon API 可以实现这一点,请参阅Resource Manager Reference。您必须为要使用特定应用程序打开的文件创建资源分支,并添加这样的资源(非常快速和肮脏的代码):

        FSRef theFsRef;
        CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
        CFURLGetFSRef(url, &theFsRef);
        HFSUniStr255 fork = {0,{0}};
        FSGetResourceForkName(&fork);
        Handle theResHandle;
        ResFileRefNum theRefFile;
        ResType rType = 'usro';
        ResID rID = 0;
        NSMutableData *aData = [[NSMutableData alloc] init];
        Byte buf[4] = {0x1A, 0x00, 0x00, 0x00};
        [aData appendData:[NSData dataWithBytes:&buf length:sizeof(buf)]];
        NSData *bData = [@"/Applications/Firefox.app" dataUsingEncoding:NSUTF8StringEncoding];
        [aData appendData:bData];
        int len = 4 + [bData length];
        [aData appendData:[NSMutableData dataWithLength:(1028-len)]];
        PtrToHand ([aData bytes], &theResHandle, [aData length]);
        FSCreateResourceFork(&theFsRef,fork.length,fork.unicode,0);
        FSOpenResourceFile(&theFsRef,fork.length,fork.unicode,fsRdWrPerm,&theRefFile);
        AddResource(theResHandle, rType, rID, "\p");
        WriteResource(theResHandle);
        ReleaseResource(theResHandle);
        UpdateResFile(theRefFile);
        CloseResFile(theRefFile);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多