Copie la captura de pantalla al portapapeles además de guardar el archivo

En OS X 10.11.6, la Cmd ⌘ Shift ⇧ 4 combinación de teclas guarda una captura de pantalla en el escritorio de forma predeterminada.

¿Hay alguna forma de copiar automáticamente el archivo en el portapapeles (además de guardar el archivo) para que la captura de pantalla se pueda pegar en un documento? ¿Tal vez hay algún ingenioso por qué poner en T y canalizar la imagen al portapapeles?

La intención es:

  1. guarde la captura de pantalla en un archivo y
  2. copiar captura de pantalla al portapapeles

con un solo comando. Siempre se agradecen los ejemplos.

Respuestas (1)

El siguiente es un ejemplo de lo que haría, si necesitara ambos, para colocar una captura de pantalla en el portapapeles y guardarla como un archivo al mismo tiempo.

Usaría Automator para crear un flujo de trabajo del Servicio 1 , al que se podría asignar un método abreviado de teclado , para ejecutar un script AppleScript para que estos dos eventos sucedan juntos.

En Automator , cree un nuevo Servicio 1 con la siguiente configuración:

  • El servicio recibe (sin entrada) en (cualquier aplicación)
  • Agregue una acción Ejecutar AppleScript , reemplazando el código predeterminado con el código AppleScript de ejemplo que se muestra más abajo:
  • Guarde el Servicio de Automator 1 como, por ejemplo: Captura de pantalla en Portapapeles y Archivo
  • Asigne un acceso directo , en Preferencias del sistema > Teclado > Accesos directos > Servicios :
    • Captura de pantalla al portapapeles y archivo      ⇧⌘5 2

Ahora, cuando presiona ⇧⌘5 2 , el cursor en forma de cruz aparece como si hubiera presionado ⇧⌘4 , sin embargo, después de hacer la selección de manera normal y soltar el mouse, el área seleccionada se copia en el portapapeles y se guarda en un archivo en la escritorio _


Actualización de macOS Mojave:

  • 1 En macOS Mojave , un Servicio en Automator ahora se llama Acción rápida , así que selecciónelo.
  • 2 De forma predeterminada, ⇧⌘5 en macOS Mojave está asignado a una nueva función de Captura de pantalla, así que prueba ⇧⌘6 en su lugar.

La convención de nomenclatura de archivos es la predeterminada de macOS para las capturas de pantalla guardadas normalmente, en mi región. Es posible que deba ajustar la siguiente línea de código para que sea como en su región:

set theDateTimeNow to (do shell script "date \"+%Y-%m-%d at %l.%M.%S %p\"")

En mi región, este comando produce el siguiente ejemplo de salida donde sería el valor de la theDateTimeNow variable , por ejemplo:

2018-01-13 at 12.04.30 PM

Entre la línea de código anterior y las dos líneas que le siguen en el script , producen, por ejemplo:

Screen Shot 2018-01-13 at 12.04.30 PM.png

En Terminal , eche un vistazo a la página del manual de datey strftime, para realizar ajustes para formatear el valor de fecha y hora de la theDateTimeNow variable , según sea necesario o deseado.

Nota: Lea los comentarios a lo largo del código AppleScript de ejemplo para comprender lo que está haciendo el script .

Esto se probó en macOS 10.13.1 y funcionó para mí sin problemas.


Ejemplo de código AppleScript :

on run {input, parameters}

    --  # Screen Shot to Clipboard and File

    --  # Clear the clipboard so the 'repeat until isReady ...' loop works properly.

    set the clipboard to ""

    --  # Copy picture of selected area to the clipboard, press: ⌃⇧⌘4
    --  # Note that on my system I need to keystroke '$' instead of '4'.
    --  # I assume this is because the 'shift' key is being pressed.        

    tell application "System Events"
        keystroke "$" using {control down, shift down, command down}
    end tell

    --  # Wait while user makes the selection and releases the mouse or times out.
    --  # Note that the time out also acts as an escape key press of sorts. In other
    --  # words, if the user actually presses the escape key it has no effect on this
    --  # script like it would if pressing the normal shortcut outside of the script.
    --  #       
    --  # As coded, the time out is 5 seconds. Adjust 'or i is greater than 10' and or  
    --  # 'delay 0.5' as appropriate for your needs to set a different length time out.
    --  # This means, as is, you have 5 seconds to select the area of the screen you
    --  # want to capture and let go of the mouse button, otherwise it times out.

    set i to 0
    set isReady to false
    repeat until isReady or i is greater than 10
        delay 0.5
        set i to i + 1
        set cbInfo to (clipboard info) as string
        if cbInfo contains "class PNGf" then
            set isReady to true
        end if
    end repeat
    if not isReady then
        --  # User either pressed the Esc key or timed out waiting.
        return  --  # Exit the script without further processing.
    end if

    --  # Build out the screen shot path filename so its convention is of 
    --  # the default behavior when saving a screen shot to the Desktop.

    set theDateTimeNow to (do shell script "date \"+%Y-%m-%d at %l.%M.%S %p\"")
    set theFilename to "Screen Shot " & theDateTimeNow & ".png"
    set thePathFilename to POSIX path of (path to desktop folder as string) & theFilename

    --  # Retrieve the PNG data from the clipboard and write it to a disk file.

    set pngData to the clipboard as «class PNGf»
    delay 0.5
    try
        set fileNumber to open for access thePathFilename with write permission
        write pngData to fileNumber
        close access fileNumber
    on error eStr number eNum
        try
            close access fileNumber
        end try
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
    end try

    --  # Convert the POSIX path filename to an alias.

    set thePathFilename to POSIX file thePathFilename as alias

    --  # Hide the file extension as is the default.

    tell application "Finder"
        try
            set extension hidden of thePathFilename to true
        end try
    end tell

end run

Nota: El código AppleScript de ejemplo anterior es solo eso, y sin incluir el manejo de errores no incluye ningún otro que pueda ser apropiado/necesario/deseable, el usuario tiene la responsabilidad de agregar cualquier manejo de errores para cualquier código de ejemplo presentado y/o código escrito por uno mismo.

Esta solución lo deja 'fuera del parque': cambié la ruta para que las capturas de pantalla no abarroten el escritorio. Creo que el atajo Cmd ⌘+Shift ⇧+4 podría reasignarse a este procedimiento. Necesitaba agregar el comando 'regresar entrada' antes de la última línea para permitir que la secuencia de comandos guarde el archivo.
@gatorback, Sí, puede asignar el Servicio de Automator ⇧⌘4 siempre que lo deshabilite o lo cambie en las preferencias de Captura de pantalla. Personalmente, no lo haría y elegí ⇧⌘5 porque normalmente no está asignado y me gustaría que el valor predeterminado funcione como se supone que debe hacerlo, sin embargo, haga lo que funcione mejor para usted. Dado que el Servicio de Automator está configurado en Servicio no recibe entrada , no veo cómo la adición return inputva a hacer algo. Además, tal como está codificado, la creación del archivo no tiene nada que ver con inputel script AppleScript. ¿Qué versión de OS X/macOS estás ejecutando?
@gatorback, usted dijo: "Esta solución la saca del parque", así que espero que vote y marque esta como la respuesta aceptada. :)
Sería bueno entender por qué era necesaria la 'entrada de retorno': esto era parte de la plantilla repetitiva del automatizador, que inicialmente comenté porque no estaba en el script recomendado. Aunque la captura de pantalla inicialmente estaba en el portapapeles, no fue así hasta que se eliminó el comentario de 'regresar entrada' y el archivo se guardó en el directorio de destino.
OS X versión 10.11.6
@gatorback, el propósito de return inputuna acción Ejecutar AppleScript es pasar a la siguiente acción , y no hay otra acción en el flujo de trabajo . Con el Servicio de Automator establecido en Servicio no recibe entrada , entonces la acción Ejecutar AppleScript no recibe , la acción ni siquiera está conectada a la configuración anterior como si el Servicio recibido estuviera configurado en algo diferente a no recibir entrada y, por lo tanto , no devuelve nada.input inputreturn input, y por lo tanto no tiene absolutamente ninguna relación con el código AppleScript de ejemplo publicado en mi respuesta.
@gatorback, además, en este caso de uso, el on run {input, parameters} bloque no es realmente necesario y se puede omitir. Funciona para mí sin el return inputy sin el on run {input, parameters} bloque , como debería porque ninguno tiene relevancia para el código real que compone el script que escribí. El código AppleScript de ejemplo en mi respuesta funciona tal cual y sin problemas en OS X 10.8.5, 10.11.6 y macOS 10.13.1. ¡He probado a fondo bajo las versiones antes mencionadas del sistema operativo y el bloque & no es necesario! return inputon run {input, parameters}