我已阅读Apple文档中的NSPasteBoard
,以及它如何允许应用程序写入PasteBoard
并允许其他应用程序读取该文本并使用它。
有人可以告诉我如何将应用程序(位于状态栏中)的文本粘贴到不同应用程序中的NSTextField
。
我要做的是与Snippet和SnippetsApp类似的事情。
如果我完全愚蠢并且错过了Apple Docs中显而易见的内容,请您指出正确的道路:)
谢谢!
答案 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 Services或Keyboard 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”......