gpt4 book ai didi

macos - 将 promise 的文件拖放到 Dock 中的应用程序图标上

转载 作者:行者123 更新时间:2023-12-03 16:10:46 26 4
gpt4 key购买 nike

当拖放到 Dock 中的应用程序图标时,是否可以在沙盒应用程序中打开 promise 的文件 NSFilesPromisePboardType ? Dock 图标正在接受放置,但从未调用 -application:openFile:

我发现的唯一引用是预沙箱: Accepting iCal events dropped on my application's icon

rdar://47917787

最佳答案

让我们分解一下:NSApplicationNSDocumentControllerNSDocument基于应用程序为您提供-application:openFile:-openDocumentWithContentsOfURL:display:completionHandler:免费 NSFilenamesPboardTypeNSURLPboardType滴。

注意:我认为在幕后这是通过 kCoreEventClass 的 NSAppleEventManager 事件处理程序实现的/kAEOpenDocumentskInternetEventClass/kAEGetURL .

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

让我们回顾一下我们的粘贴板知识:粘贴板在所有应用程序中共享。有用于复制、查找和拖动等任务的默认粘贴板。

当拖动开始时,应用程序将写入共享拖动粘贴板。因此,我们现在需要的只是有关拖放到 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>

好旧的 Carbon 为我们提供了保障。

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

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

CFRelease(pboardRef);

从这里开始像任何其他 promise 文件一样处理。

关于macos - 将 promise 的文件拖放到 Dock 中的应用程序图标上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com