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

Nav*_*dhu 8 macos cocoa copy paste nspasteboard

NSPasteBoard在Apple文档中已经了解了它,以及它如何允许应用程序写入PasteBoard并允许其他应用程序读取该文本并使用它.

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

我想要做的是与SnippetSnippetsApp类似的东西.

如果我完全愚蠢并且错过了Apple Docs中的明显内容,请你指点我正确的道路:)

谢谢!

Pet*_*sey 8

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

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

此外,您不能假设用户想要粘贴到NSTextField中.它可以是NSTextView,或在web视图一个textarea,或碳的EditText或MLTE控制,或作为一个Qt或wxWidgets的文本编辑器一些其它的文本编辑器等.他们甚至可能正在使用带有列表视图的应用程序,以便将文本直接粘贴到其中.

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

要伪造⌘V事件,请查看CGEventTap.您需要使用CGEventCreateKeyboardEvent函数来创建事件本身,并且由于该函数采用密钥代码,因此您需要查找⌘V组合的V部分的正确密钥代码,这将需要通过Text输入源服务键盘布局服务,具体取决于布局.

你可能会在这一点上考虑使用辅助发现在编辑菜单中的粘贴菜单项,然后将其发送的AXPress消息,但"粘贴"和"编辑"只有英语对这些概念的话; 如果您这样做,您的应用程序将无法使用任何其他语言.您可以通过顺序(第三个菜单,第六菜单项)去,但后来你的应用程序将在应用程序中没有一个文件菜单无法正常工作,或没有重做菜单项,或有两个撤消菜单项(Photoshop中).锻造⌘V事件真的是要走的路.


Nic*_*ore 8

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

// 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);  
}
Run Code Online (Sandbox Code Playgroud)

  • @cocoa coder他们可能不是沙盒.今年7月之前在商店中的应用程序可以保留未包装. (2认同)