4

我曾经模拟 CMD V 事件将数据从我的应用程序粘贴到活动应用程序。但是,似乎有了新的沙盒限制,这不再被允许了。

有人知道另一种调用粘贴的方法吗?

4

1 回答 1

0

您可以使用 AppleScript 做到这一点:

set the clipboard to "MyString"
tell application "System Events"
    keystroke "v" using {command down}
end tell

在可可应用程序中,您可以使用NSAppleScript. 假设您的应用程序资源文件夹中有一个名为 Script.txt 的文件,如下所示:

tell application "System Events"
    keystroke "v" using {command down}
end tell

然后,您可以使用以下代码:

- (void)pasteInActiveApp:(NSData *)data type:(NSString *)type
{
    NSPasteboardItem *item = [[NSPasteboardItem alloc] init];
    [item setData:data forType:type];

    NSPasteboard *pboard = [NSPasteboard generalPasteboard];
    [pboard clearContents];
    [pboard writeObjects:@[item]];

    NSDictionary *errorDict = nil;
    NSAppleScript *script = [[NSAppleScript alloc] initWithSource:[self pasteScript]];
    NSAppleEventDescriptor *result = [script executeAndReturnError:&errorDict];
    // Handle result
}

- (NSString *)pasteScript
{
    static NSString *script;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSError *error;
        script = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Script" withExtension:@"txt"] encoding:NSUTF8StringEncoding error:&error];
        if (error) {
            // Handle error
        }
    });

    return script;
}

现在,您需要做的就是pasteInActiveApp:type:使用要粘贴的数据和粘贴板类型调用该方法。

顺便说一句,我认为将后台运行的应用程序中的内容粘贴到前台的应用程序中并不是一个好主意。首先,您不知道将其粘贴到哪个应用程序中,即使您知道,您也永远不知道将其粘贴到哪里。用户可能有一个带有多个输入字段(或类似字段)的表单的浏览器。此外,用户可能不希望您这样做。

编辑:更改了代码,以便在 Objective-C 代码而不是苹果脚本中设置数据。

于 2013-06-20T11:16:12.780 回答