微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

macos – 将承诺的文件放到Dock中的应用程序图标上

是否可以在Dock中的应用程序图标上打开沙箱应用程序中的承诺文件NSFilesPromisePboardType? Dock图标正在接受drop,但是-application:openFile:永远不会被调用.

我找到的唯一参考是预沙箱:
Accepting iCal events dropped on my application’s icon

解决方法

让我们分解一下:基于NSDocument的应用程序中的NSApplication和NSDocumentController为您提供了-application:openFile:或-opendocumentWithContentsOfURL:display:completionHandler:在NSFilenamesPboardType和NSURLPboardType丢弃的情况下免费提供.

注意:我认为这是使用kCoreEventClass / kAEopendocuments和kInternetEventClass / kAEGetURL的NSAppleEventManager事件处理程序实现的.

不幸的是,他们没有处理NSFilesPromisePboardType.

让我们刷新我们的粘贴板知识:粘贴板在所有应用程序之间共享.有复制,查找和拖动等任务的认粘贴板.

当拖动开始时,应用程序将写入共享拖动粘贴板.所以我们现在需要的是关于Drop to Dock图标的通知.

这是NSService发挥作用的地方:

<key>NSServices</key>
<array>
    <dict>
        <key>NSMessage</key>
        <string>openService</string>
        <key>NSSendTypes</key>
        <array>
            <string>public.data</string>
        </array>
        <key>NSMenuItem</key>
        <dict>
            <key>default</key>
            <string>Open</string>
        </dict>
    </dict>
</array>

并在代码中设置它:

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    [NSApp setServicesProvider:self];
}

- (void)openService:(NSPasteboard *)serviceBoard
           userData:(Nsstring *)userData
              error:(Nsstring **)error
{
}

需要注意的是,NSService粘贴板不是NSDragPboard粘贴板.

但它们都是共享的,所以我们可以访问我们想要的那个:

NSPasteboard *dragPboard = [NSPasteboard pasteboardWithName:NSDragPboard];

if ([[dragPboard types] containsObject:NSFilesPromisePboardType])
{
}

一个问题是我们没有 – [NSDraggingInfo namesOfPromisedFilesDroppedAtDestination:].

#import <applicationservices/applicationservices.h>

好老碳让我们得到了保障.

PasteboardRef pboardRef = NULL;
    PasteboardCreate((__bridge CFStringRef)NSDragPboard,&pboardRef);
    PasteboardSetPasteLocation(pboardRef,(__bridge CFURLRef)temporaryDirectory);

    Nsstring *urlString = [dragPboard stringForType:(Nsstring *)kPasteboardTypeFileURLPromise];

    CFRelease(pboardRef);

像这里的任何其他承诺文件一样处理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐