我已经阅读NSPasteBoard
了 Apple 文档,以及它如何允许应用程序写入PasteBoard
并允许其他应用程序读取该文本并使用它。
有人可以告诉我如何将来自应用程序(位于状态栏中)的文本粘贴到NSTextField
另一个应用程序中。
我想做的是类似于Snippet和SnippetsApp所做的事情。
如果我完全愚蠢并且错过了Apple Docs中的明显内容,请您指出正确的路径:)
谢谢!
我已经阅读NSPasteBoard
了 Apple 文档,以及它如何允许应用程序写入PasteBoard
并允许其他应用程序读取该文本并使用它。
有人可以告诉我如何将来自应用程序(位于状态栏中)的文本粘贴到NSTextField
另一个应用程序中。
我想做的是类似于Snippet和SnippetsApp所做的事情。
如果我完全愚蠢并且错过了Apple Docs中的明显内容,请您指出正确的路径:)
谢谢!
有人可以告诉我如何将来自应用程序(位于状态栏中)的文本粘贴到不同应用程序内的 NSTextField 中。
粘贴是在接收应用程序中发生的事情。写到粘贴板就是复制。
此外,您不能假设用户想要粘贴到 NSTextField 中。它可能是 NSTextView,或 WebView 中的 textarea,或 Carbon EditText 或 MLTE 控件,或其他一些文本编辑器,例如 Qt 或 wxWidgets 文本编辑器。他们甚至可能正在使用带有列表视图的应用程序,让他们可以将文本直接粘贴到其中。
因此,没有编程方式可以直接告诉应用程序“这里有一些文本——请粘贴”。您必须将其复制到通用粘贴板,然后伪造一个通常会导致最前面的应用程序粘贴的事件。Charlie 对 ⌘V 的建议是一种方式,虽然很棘手;Dvorak 布局将 V 放在另一个键上,而“Dvorak QWERTY ⌘”布局将 V-with-⌘(相对于 V-without-⌘)放在与 QWERTY 的 V 相同的键上。
要伪造 ⌘V 事件,请查看CGEventTap。您需要使用该CGEventCreateKeyboardEvent
函数来创建事件本身,并且由于该函数需要一个键码,因此您需要为 ⌘V 组合的 V 部分查找正确的键码,这需要通过Text输入源服务或键盘布局服务,取决于布局。
此时您可能会想到使用 Accessibility 在 Edit 菜单中找到 Paste 菜单项并向其发送 AXPress 消息,但“Paste”和“Edit”只是这些概念的英文单词;如果您这样做,您的应用程序将无法以任何其他语言运行。您可以按顺序(第三个菜单,第六个菜单项),但是您的应用程序将无法在没有文件菜单、没有重做菜单项或两个撤消菜单项 (Photoshop) 的应用程序中运行。伪造一个⌘V事件确实是要走的路。
这是发布 ⌘+key 事件的一些工作代码(假设已知键码):
// 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);
}
通常唯一的方法是将其写入 NSPasteboard,然后切换到另一个应用程序并使用一些 Carbon 功能按“Command-V”...