2010-04-21 82 views
7

我已阅读Apple文档中的NSPasteBoard,以及它如何允许应用程序写入PasteBoard,并允许其他应用程序读取并使用文本。如何使用Cocoa将文本从一个应用程序粘贴到另一个应用程序?

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

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

如果我完全傻,错过了在苹果文档的明显,可以请你点我在正确的道路:)

谢谢!

回答

8

有人能告诉我如何粘贴文本从应用程序(位于状态栏中)转换为不同应用程序内的NSTextField。

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

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

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

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

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

+0

CGEventSourceRef不工作,而我已沙箱我的应用程序。有什么办法可以解决这个问题吗? – iPhoneDv 2013-11-12 10:41:52

+0

@iPhoneDv:你应该问一个单独的问题,提供更多关于你在做什么和遇到什么问题的信息。 – 2013-11-12 18:56:12

+0

下面是KeyboardLayoutServices文档的一个非断开的链接:https://developer.apple.com/legacy/library/documentation/Carbon/Reference/KeyboardLayoutServices/(当然,如果用户禁用或更改了它,这不会失败粘贴键盘快捷方式?) – jtbandes 2017-03-05 02:43:32

0

一般的唯一方法是将其写入NSPasteboard,然后切换到另一个应用程序,并使用一些碳功能按“命令-V” ......

6

这里的一些工作的代码张贴⌘+按键事件(假设一个已知的键码):

// 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); 
} 
+0

任何方式使这项工作在沙箱模式? – 2012-11-22 19:47:29

+1

@cocoa coder:我很确定没有。 – 2012-11-23 08:43:49

+0

appstore中有一些应用程序可以通过单击表中的项目将数据实际粘贴到另一个应用程序。想知道他们是怎么做到的。 – 2012-11-23 11:34:45

相关问题