从 osx 中的任何应用程序获取选定文本的辅助功能 API 替代方案

Posted

技术标签:

【中文标题】从 osx 中的任何应用程序获取选定文本的辅助功能 API 替代方案【英文标题】:Accessibility API alternative to get selected text from any app in osx 【发布时间】:2013-11-16 21:26:21 【问题描述】:

我已经编写了一个代码,使我能够在 TextEdit.app 或其他几个应用程序中获取选定的文本。我的问题是我需要在任何应用程序中获取选定的文本。似乎辅助功能 API 无法获取每个应用程序的选定文本,因为我可以通过使用辅助功能检查器来证明。

第一张图片显示了辅助功能 API 如何从 TextEdit.app 中的 AXTextArea 获取选定文本作为属性:

然后我尝试从 TextWrangler.app 获取相同的信息,但它不会以相同的方式工作。

是否有替代方法可以从任何应用程序或至少大部分应用程序中获取选定的文本信息?

【问题讨论】:

【参考方案1】:

我知道的唯一选择是发送 Cmd-c 并监控粘贴板:

+ (void)sendCommandC

    CGKeyCode _C = [[DJRKeyboardTools sharedInstance] keyCodeForChar:'c'];
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef pasteCommandDown = CGEventCreateKeyboardEvent(source, _C, YES);
    CGEventSetFlags(pasteCommandDown, kCGEventFlagMaskCommand);
    CGEventRef pasteCommandUp = CGEventCreateKeyboardEvent(source, _C, NO);

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

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

那段代码将发布键盘事件。你需要更多的代码。我的这些要点可以帮助您开始:

https://gist.github.com/djromero/7326451 键盘事件(发布键盘快捷键) https://gist.github.com/djromero/7326432 键盘工具(获取正确的字符代码) https://gist.github.com/djromero/7326400监控粘贴板

【讨论】:

这可行并且可能被接受为正确答案。我还想提一下名为 Jumpcut.app 的开源代码,它实现了解决这个问题的代码。

以上是关于从 osx 中的任何应用程序获取选定文本的辅助功能 API 替代方案的主要内容,如果未能解决你的问题,请参考以下文章

从 UITableViewController 中的选定行获取选定的标签文本

如何从android中的edittext中获取选定的文本?

如何从表格视图中的选定单元格中获取文本?

如何从 UITextView 获取选定的文本框

使用 C++\Qt 从当前窗口中获取选定的文本

从 DataGridView 选定的单元格中获取文本