如何在OS X上以编程方式粘贴?

时间:2013-11-03 17:46:36

标签: objective-c paste osx-mavericks nspasteboard

我可以访问常规NSPasteboard。我写了粘贴板NSData

NSPasteboard *pboard = [NSPasteboard generalPasteboard];

[pboard clearContents];
[pboard setData:newContent forType:type];

现在我想以编程方式粘贴 文本光标在另一个应用中的正确位置上闪烁。 点击⌘+ V可以正常工作。

有人知道吗? 也许如何粘贴以编程方式调用快捷方式?

2 个答案:

答案 0 :(得分:3)

如果您想在自己的应用中执行粘贴操作,则可以使用Responder Chain将paste:操作发送给第一响应者:

[NSApp sendAction:@selector(paste:) to:nil from:self];

文档说明了将nil作为to:参数传递时会发生什么:

  

如果aTarget为nil,则sharedApplication会查找可以响应消息的对象,即实现与anAction匹配的方法的对象。它从关键窗口的第一个响应者开始。

但是,如果您想在另一个应用中执行粘贴操作,那么没有真正好的方法可以做到这一点。您可以期待的最好的是执行“假装” cmd - v 操作,并希望这意味着“粘贴”在目标应用程序中......

#import <Carbon/Carbon.h>

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef pasteCommandDown = CGEventCreateKeyboardEvent(source, kVK_ANSI_V, YES);
CGEventSetFlags(pasteCommandDown, kCGEventFlagMaskCommand);

CGEventRef pasteCommandUp = CGEventCreateKeyboardEvent(source, kVK_ANSI_V, NO);

CGEventPost(kCGAnnotatedSessionEventTap, pasteCommandDown);
CGEventPost(kCGAnnotatedSessionEventTap, pasteCommandUp);

CFRelease(pasteCommandUp);
CFRelease(pasteCommandDown);
CFRelease(source);

正如另一条评论所述,这是一种粗略的方式。它有点不安全(你不总是知道 cmd - v 意味着什么)而且非常hackish。

答案 1 :(得分:1)

假设有一个非自定义视图:

当视图符合copy&amp;粘贴,它有一个复制和粘贴方法。 GIVEN键盘cmd + v有效,它确实有粘贴:作为方法

call [target paste:nil];