如何使用Cocoa将文本从一个应用程序粘贴到另一个应用程序

时间:2010-04-21 06:25:21

标签: cocoa macos copy paste nspasteboard

我已阅读Apple文档中的NSPasteBoard,以及它如何允许应用程序写入PasteBoard并允许其他应用程序读取该文本并使用它。

有人可以告诉我如何将应用程序(位于状态栏中)的文本粘贴到不同应用程序中的NSTextField

我要做的是与SnippetSnippetsApp类似的事情。

如果我完全愚蠢并且错过了Apple Docs中显而易见的内容,请您指出正确的道路:)

谢谢!

3 个答案:

答案 0 :(得分:8)

  

有人可以告诉我如何将应用程序(位于状态栏中)的文本粘贴到另一个应用程序内的NSTextField中。

粘贴是接收应用程序中发生的事情。写入粘贴板正在复制。

此外,您不能假设用户想要粘贴到NSTextField中。它可以是NSTextView,WebView中的textarea,Carbon EditText或MLTE控件,或其他文本编辑器,如Qt或wxWidgets文本编辑器。他们甚至可能正在使用带有列表视图的应用程序,以便将文本直接粘贴到其中。

所以,没有直接告诉应用程序的程序化方法“这里有一些文本 - 请粘贴它”。您必须将其复制到常规粘贴板,然后伪造一个通常应该导致最前面的应用程序粘贴的事件。查理对⌘V的建议是一种方式,尽管很棘手; Dvorak布局将V放在另一个键上,而“DvorakQWERTY⌘”布局将V-with-⌘(而不是V-without-⌘)放在与QWERTY的V相同的键上。

要伪造⌘V事件,请查看CGEventTap。您需要使用the CGEventCreateKeyboardEvent function来创建事件本身,并且由于该函数需要一个关键代码,因此您需要查找⌘V组合的V部分的正确密钥代码,这将需要浏览Text Input Source ServicesKeyboard Layout Services,具体取决于布局。

此时您可能会想到使用“辅助功能”在“编辑”菜单中找到“粘贴”菜单项并向其发送AXPress消息,但“粘贴”和“编辑”只是这些概念的英文单词;如果您这样做,您的应用程序将无法使用任何其他语言。您可以按顺序(第三个菜单,第六个菜单项),但是如果没有“文件”菜单,没有“重做”菜单项或两个“撤消”菜单项(Photoshop),您的应用程序将无法运行。锻造⌘V事件真的是要走的路。

答案 1 :(得分:7)

以下是发布⌘+键事件(假设已知密钥代码)的一些工作代码:

// some common keycodes
#define KEY_CODE_x ((CGKeyCode)7)
#define KEY_CODE_c ((CGKeyCode)8)
#define KEY_CODE_v ((CGKeyCode)9)

void DCPostCommandAndKey(CGKeyCode key)
{
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);

    CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE);
    CGEventSetFlags(keyDown, kCGEventFlagMaskCommand);
    CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE);

    CGEventPost(kCGAnnotatedSessionEventTap, keyDown);
    CGEventPost(kCGAnnotatedSessionEventTap, keyUp);

    CFRelease(keyUp);
    CFRelease(keyDown);
    CFRelease(source);  
}

答案 2 :(得分:0)

通常唯一的方法是将它写入NSPasteboard然后切换到另一个应用程序并使用一些Carbon功能按“Command-V”......