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

Bin*_*ian 3 objective-c paste nspasteboard osx-mavericks

我一般都可以访问NSPasteboard。我在粘贴板上写了我的NSData.

NSPasteboard *pboard = [NSPasteboard generalPasteboard];

[pboard clearContents];
[pboard setData:newContent forType:type];
Run Code Online (Sandbox Code Playgroud)

现在我想以编程方式粘贴。该文本光标闪烁的正确位置上的另一个应用程序。打 ?+ V 有效。

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

Dav*_*ong 5

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

[NSApp sendAction:@selector(paste:) to:nil from:self];
Run Code Online (Sandbox Code Playgroud)

文档说明了当您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);
Run Code Online (Sandbox Code Playgroud)

正如另一条评论中提到的,这是一种粗暴的做法。这有点不安全(你并不总是知道cmd-v意味着什么)并且非常hackish。