【问题标题】:Saving screenshots with name of title bar保存带有标题栏名称的屏幕截图
【发布时间】:2018-02-17 00:30:01
【问题描述】:

使用cmd+shift+4组合截取的截图标题为“Screen Shot DATE at TIME”,并没有说明太多。我希望我的应用程序屏幕截图的标题类似于“YYYYMMDD_HHMMSS 无论标题栏文本”。

在 Windows 上,我使用 GreenShots,默认情况下它会使用时间戳命名窗口的每个屏幕截图,然后在标题栏上加上名称。

在我的 OS X El Capitan 上,我找不到可以执行此操作的开源应用程序,因此 I was suggested 改用 AppleScript。

我现在已经接近解决方案了

do shell script "screencapture -W ~/tmp"
delay 3
tell application "System Events"
    set frontApp to name of first application process whose frontmost is true
end tell
tell application frontApp
    if the (count of windows) is not 0 then
        set window_name to name of front window
    end if
end tell
set screenShotName to do shell script "date +%Y%m%d_%H%M%S_"
set screenShotName to screenShotName & window_name
do shell script "mv ~/tmp ~/\"" & screenShotName & "\".png"

要保存它,请将其复制粘贴到脚本编辑器中并将其保存为应用程序。要使用它,请双击您的屏幕截图应用图标,然后点击您要截屏的窗口。

但是,这种方法存在一些问题:

  • 通常我必须在要截屏的窗口上单击两次,第一次选择它,第二次将其聚焦
  • 这比我以前做的要费力得多,我宁愿使用键盘快捷键

是否可以修复此脚本以解决上述问题,或者我应该采取不同的方法?

【问题讨论】:

    标签: macos automation applescript screenshot


    【解决方案1】:

    我进行了几次测试,我认为 Apple 处理服务的方式存在错误。在调用 Service 时,所选进程的窗口列表不存在 (!!)。如果您从应用程序中调用它,它就会存在(这就是我测试它的方式!)。 在服务事件期间,UI 元素也不再可用(当您从应用程序运行它时仍然不是这种情况!!)。

    因此,经过多次测试和尝试,我通过将其设为应用程序然后要求 Automator 启动该应用程序来解决此问题。

    要做的事情很少:

    1) 输入这个脚本是Script Editor

    delay 2
    set DefaultPath to POSIX path of (path to desktop folder)
    set TimeStamp to do shell script "date +%Y%m%d_%H%M%S_"
    tell application "System Events"
    set frontApp to first application process whose frontmost is true
    set FWindow to first window of frontApp
    set FName to DefaultPath & TimeStamp & (name of FWindow) & ".jpg"
    set {x, y} to position of FWindow
    set {w, h} to size of FWindow
    do shell script "screencapture -R " & x & "," & y & "," & w & "," & h & " " & quoted form of FName
    end tell
    

    2) 将该脚本另存为脚本编辑器中的应用程序(而不是脚本)。保存在某个地方,任何地方都可以。

    3) 在您的 Automator 服务中,添加操作“启动应用程序”。然后,在此操作中,选择“应用程序其他...”并选择在步骤 2 中保存的应用程序。

    4) 打开系统偏好设置,“安全”,选项卡“机密性”。在左侧列表中选择“辅助功能”,然后单击右侧列表底部的“+”。添加并选择您在步骤 2 中保存的应用程序。这将允许此应用程序驱动您的 Mac。

    对我来说效果很好!

    此解决方法的不利方面是,在您启动服务后,您有大约 2 秒的时间来选择要复制的窗口。如果你不这样做,那么最前面的应用程序将是脚本本身......没有窗口! 我将延迟设置为 2 秒,以便您单击要捕获的窗口,但您可以通过更改脚本的第一行将其减少到 1 秒或 1.5...。

    【讨论】:

    • 感谢您抽出宝贵时间对此进行测试并找到解决方案。除了延迟,我们可以使用 -W 选项让它像 cmd+shift+4 上的默认截图工具一样,调用窗口选择吗?另一种方法是让脚本简单地等待第一次用户点击(假设它落在一个窗口上)。
    • 是的,可以使用 -W 选项。我测试了它,没问题。但是,这样做,您将不会获得窗口的名称。您必须为屏幕复制文件分配一个修复名称。如果您之前一直添加时间戳,这可能不是问题。因此,如果您可以接受没有该窗口名称,那就完美了
    • 好的,谢谢。那么让脚本等待第一个用户点击呢?有没有办法处理用户点击桌面的情况(当前没有选择的窗口会抛出错误)。
    • 循环等待事件超出了 Applescript 的覆盖范围。所以不幸的是,如果你留在 AppleSscript 中,答案是“不”。你可以做到这一点,但是使用更强大的工具,比如使用 ObjC 或 Swift 等语言的 xCode。
    • 在一个不是脚本窗口的窗口被选中之前以小延迟循环会怎样?
    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 2012-10-28
    • 2022-01-22
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多