【问题标题】:Get currently highlighted text in OSX app?在 OSX 应用程序中获取当前突出显示的文本?
【发布时间】:2015-08-26 14:27:45
【问题描述】:

有没有办法从 OSX 应用程序中检测当前选定/突出显示的文本并将其存储在字符串中?

例如,如果我进入 Safari 并突出显示随机网站中的一个段落,然后启动我的应用程序,有没有办法获取我在 Safari 中突出显示的文本?

我没有听说过这个,但我不是一个例子,所以我不确定它是否可能。

谢谢!

【问题讨论】:

  • 如果用户将它复制到剪贴板,你可以从那里得到它(见this question)。我怀疑你是否能得到只是突出显示但没有复制的东西,但我不确定。
  • 您需要获取每个窗口的列表,并检查它们是否有 NSText 实例,然后从那里获取突出显示的文本。
  • 我可以获得所有打开窗口的列表,但我如何检查 NSText 实例?您能否将我链接到一些文档?谢谢。

标签: macos swift


【解决方案1】:

一般来说,要从另一个应用程序获取选定的文本,您需要启用可访问性。那就是它需要被授权来控制系统。 在代码中,您可以使用 AX Accessibility API,或者您可以将 AppleScript 与“系统事件”一起使用

使用 Safari,您可以拥有自定义扩展程序,但这同样复杂且投资回报率较低。

【讨论】:

    【解决方案2】:

    这应该适用于任何使用命令 C 进行复制的应用程序,即几乎所有应用程序。下面的例子是 Safari。在运行之前,请确保用户在 Safari 中突出显示了文本,并且随后不会更改选项卡或窗口。如果用户专注于另一个应用程序,它就可以了。延误至关重要。您可能可以用更少的时间逃脱,但这一切都取决于用户系统在运行时的状态,因此延迟越长,进程越稳健。

    tell application "System Events"
        tell application "Safari" to activate -- focus on Safari's current tab
        delay 0.25 --critical
        keystroke "c" using command down -- copy clipboard contents
        delay 0.25 --critical
    end tell
    
    set highlightedText to the clipboard as Unicode text
    display dialog highlightedText -- just to see the results, otherwise delete
    
    set the clipboard to "" -- return clipboard to blank state
    

    如果您只是打算使用 Safari 执行此操作,那么以下是您的最佳选择,通常不需要延迟。否则,与上述相同。

    tell application "Safari"
        set highlightedText to (do JavaScript "(''+getSelection())" in document 1) as string
    end tell
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2012-07-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多