Kopieren Sie den Screenshot zusätzlich zum Speichern der Datei in die Zwischenablage

In OS X 10.11.6 Cmd ⌘ Shift ⇧ 4 speichert die Tastenkombination standardmäßig einen Screenshot auf dem Desktop.

Gibt es eine Möglichkeit, die Datei automatisch in die Zwischenablage zu kopieren (zusätzlich zum Speichern der Datei), damit der Screenshot in ein Dokument eingefügt werden kann? Vielleicht gibt es einen cleveren Grund, das Bild in die Zwischenablage zu leiten?

Die Absicht ist:

  1. Screenshot in einer Datei speichern und
  2. Screenshot in die Zwischenablage kopieren

mit einem einzigen Befehl. Beispiele sind immer willkommen.

Antworten (1)

Das Folgende ist ein Beispiel dafür, was ich tun würde, wenn ich beides brauche, um einen Screenshot in die Zwischenablage zu legen und ihn gleichzeitig als Datei zu speichern.

Ich würde Automator verwenden , um einen Dienst 1- Workflow zu erstellen , dem eine Tastenkombination zugewiesen werden könnte, um ein AppleScript- Skript auszuführen , damit diese beiden Ereignisse zusammen auftreten.

Erstellen Sie in Automator einen neuen Dienst 1 mit den folgenden Einstellungen:

  • Dienst empfängt (keine Eingabe) in (beliebiger Anwendung)
  • Fügen Sie eine Aktion „AppleScript ausführen“ hinzu und ersetzen Sie den Standardcode durch den weiter unten gezeigten AppleScript - Beispielcode :
  • Speichern Sie den Automator-Dienst 1 als zB: Screenshot in Zwischenablage und Datei
  • Weisen Sie unter Systemeinstellungen > Tastatur > Kurzbefehle > Dienste einen Kurzbefehl zu :
    • Screenshot in Zwischenablage und Datei      ⇧⌘5 2

Wenn Sie jetzt ⇧⌘5 2 drücken, erscheint der Fadenkreuz-Cursor genauso, als ob Sie ⇧⌘4 gedrückt hätten , aber nachdem Sie die Auswahl wie gewohnt getroffen und die Maus losgelassen haben, wird der ausgewählte Bereich sowohl in die Zwischenablage kopiert als auch in einer Datei auf dem gespeichert Schreibtisch .


macOS Mojave-Update:

  • 1 In macOS Mojave wird ein Dienst in Automator jetzt als Schnellaktion bezeichnet , also wählen Sie das aus.
  • 2 Standardmäßig ist ⇧⌘5 in macOS Mojave einer neuen Screenshot-Funktion zugewiesen, also versuchen Sie es stattdessen mit ⇧⌘6 .

Die Dateinamenskonvention entspricht der macOS- Standardeinstellung für normal gespeicherte Screenshots in meiner Region. Möglicherweise müssen Sie die folgende Codezeile anpassen, damit sie wie in Ihrer Region ist:

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

In meiner Region erzeugt dieser Befehl die folgende Beispielausgabe, in der der Wert der theDateTimeNow Variablen z. B. wäre:

2018-01-13 at 12.04.30 PM

Zwischen der obigen Codezeile und den beiden folgenden Zeilen im Skript erzeugen sie z. B.:

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

Werfen Sie in Terminal einen Blick auf die Manpage für dateund strftime, um Anpassungen vorzunehmen, um den Datums- und Uhrzeitwert der Variablen theDateTimeNow nach Bedarf oder Wunsch zu formatieren.

Hinweis: Lesen Sie die Kommentare im AppleScript- Beispielcode , um zu verstehen, was das Skript tut.

Dies wurde unter macOS 10.13.1 getestet und hat bei mir ohne Probleme funktioniert.


Beispiel AppleScript -Code :

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

Hinweis: Der obige Beispiel -AppleScript- Code ist genau das, und abgesehen davon, dass die enthaltene Fehlerbehandlung keine anderen enthält, die angemessen/erforderlich/gewünscht sind, liegt es in der Verantwortung des Benutzers, eine Fehlerbehandlung für jeden präsentierten Beispielcode und/oder Code hinzuzufügen selbst geschrieben.

Diese Lösung schlägt es aus dem Park: Ich habe den Pfad geändert, damit Screenshots den Desktop nicht überladen. Ich würde denken, dass die Tastenkombination Cmd ⌘+Shift ⇧+4 dieser Prozedur neu zugewiesen werden könnte. Ich musste den Befehl „return input“ vor der allerletzten Zeile hinzufügen, damit das Skript die Datei speichern kann.
@gatorback, Ja, Sie könnten den Automator-Dienst ⇧⌘4 zuweisen, vorausgesetzt, Sie deaktivieren oder ändern ihn in den Screenshot-Einstellungen. Persönlich würde ich es nicht tun und ⇧⌘5 wählen , weil es normalerweise nicht bereits zugewiesen ist und ich möchte, dass die Standardeinstellung so funktioniert, wie es soll, aber tun, was für Sie am besten funktioniert. Da der Automator-Dienst auf Service Receives no input eingestellt ist , sehe ich nicht, wie das Hinzufügen return inputirgendetwas bewirken wird. Außerdem hat die Erstellung der Datei, wie codiert, überhaupt nichts mit inputdem AppleScript-Skript zu tun. Welche Version von OS X/macOS verwenden Sie?
@gatorback, Sie sagten "Diese Lösung schlägt es 'aus dem Park'", also würde ich hoffen, dass Sie dann abstimmen und dies als akzeptierte Antwort markieren würden. :)
Es wäre schön zu verstehen, warum „return input“ notwendig war: Dies war Teil der Boilerplate-Vorlage des Automators, die ich zunächst auskommentiert hatte, weil sie nicht im empfohlenen Skript enthalten war. Obwohl der Screenshot zunächst in der Zwischenablage lag, wurde er erst bei „return input“ de-kommentiert und die Datei im Zielverzeichnis gespeichert.
OS X-Version 10.11.6
@gatorback, Der Zweck return inputeiner Run AppleScript- Aktioninput besteht darin, die an die nächste Aktion weiterzuleiten , und es gibt keine andere Aktion im Workflow . Wenn der Automator-Dienst auf „Service empfängt keine Eingabe“ eingestellt ist , erhält die Aktion „ AppleScript ausführen“ „nein“ . Die Aktion ist nicht einmal mit den obigen Einstellungen verbunden, als ob „Dienst empfängt “ auf etwas anderes als „ keine Eingabe“ festgelegt wurde und daher nichts zurückgibtinputreturn input, und hat daher absolut keinen Einfluss auf den in meiner Antwort geposteten AppleScript - Beispielcode .
@gatorback, Auch in diesem Anwendungsfall wird der on run {input, parameters} Block nicht wirklich benötigt und kann weggelassen werden. Es funktioniert für mich ohne return inputund ohne den on run {input, parameters} Block , wie es sollte, da beide keine Relevanz für den tatsächlichen Code haben, aus dem das von mir geschriebene Skript besteht . Der AppleScript- Beispielcode in meiner Antwort funktioniert unverändert und ohne Probleme unter OS X 10.8.5, 10.11.6 und macOS 10.13.1. Ich habe gründlich unter den oben genannten Versionen des Betriebssystems getestet und & Block sind nicht erforderlich! return inputon run {input, parameters}