objective-c – 如何从其他应用程序中获取所选文本?

我将很快开发一个应用程序,它需要在最前面的应用程序窗口中获取当前选定的文本,无论是Safari,Pages,TextEdit,Word等,并对该文本执行某些操作.

我的目标是找到一个尽可能多的应用程序的解决方案.到目前为止,我考虑过使用AppleScript,但这会限制可以与我的服务一起使用的应用程序数量.至少必须支持这些常见的应用程序:Safari,Firefox(没有AppleScript?),Word,Excel,……

我还考虑将剪贴板的内容保存在临时变量中,然后模拟文本复制操作(Cmd-C),获取文本然后重新放入原始内容.这可能会在模拟复制操作时突出显示“编辑”菜单项对我来说似乎有些笨拙. IMO这个解决方案似乎不适合商业产品.

我也希望得到的不仅仅是选择(即:Safari或Word中页面的完整内容等),以便将来添加一些额外的功能.

有关如何实现此行为的任何想法/详细信息?

提前感谢任何提示

N.B:我需要支持至少10.4及以上,但理想情况下也要超过10.4.

更新:

我选择的解决方案:使用“责任链”设计模式(GOF)结合3种不同的输入方法(Pasteboard,AppleScript和Accessibility),自动使用最佳可用输入源.

请注意,当使用NSAppleScript的executeAndReturnError:方法返回NSAppleEventDescriptor(假设为“描述符”实例)时,对于[descriptor stringValue]方法返回内容,在AppleScript中必须使用“return someString”OUTSIDE of“tell”block否则什么也不会被退回.

解决方法

可访问性将起作用,但仅限于辅助设备的访问权限已启用.

您需要获取当前应用程序,然后获取其聚焦的UI元素,然后获取其选定的文本范围及其值(全文)和选定的文本范围.您可以只获取其选定的文本,但这可以连接或忽略多个选择.

准备好任何失败的步骤:应用程序可能没有任何窗口,可能没有焦点的UI元素,焦点的UI元素可能没有文本,并且焦点的UI元素可能只有一个空的选定文本范围.

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...