Clipboard und ClipboardAll

Clipboard ist eine interne Variable, die den aktuellen Inhalt der Windows-Zwischenablage enthält, falls dieser in Textform ist. ClipboardAll hingegen enthält alles von der Zwischenablage, wie z. B. Bilder und Formatierung.

Jede Textzeile in Clipboard endet normalerweise mit einem CR- und LF-Zeichen, die im Skript als `r`n ausgedrückt werden können. Dateien (die beispielsweise mit Strg+C kopiert wurden) gelten als Text: Sie werden automatisch in ihren Dateinamen umgewandelt (mit vollständigem Pfad), sobald Clipboard im Skript verwendet wird. Das folgende Beispiel zeigt, wie die Dateien einzeln extrahiert werden können:

Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , Dateinummer %A_Index% ist %A_LoopField%.`n`nWeiter?
    IfMsgBox, No, break
}

Mit dem Sort-Befehl können die Dateinamen in alphabetischer Reihenfolge sortiert werden. Um die Dateinamen aus der Zwischenablage in eine Datei zu schreiben, nutzt man FileAppend, %clipboard%`r`n, C:\Meine Datei.txt. Mit #ClipboardTimeout kann man einstellen, wie lange das Skript versuchen soll, die Zwischenablage zu öffnen (wenn die Zwischenablage zum Beispiel von einer anderen Anwendung blockiert wird).

Einfache Beispiele:
clipboard = eigener Text   ; Ersetzt die Zwischenablage mit neuem Inhalt.
clipboard =   ; Leert die Zwischenablage.
clipboard = %clipboard%   ; Wandelt jede kopierte Datei, HTML oder anders formatierter Text in Klartext um.
clipboard = %clipboard% angefügter Text.   ; Fügt etwas Text an die Zwischenablage.
StringReplace, clipboard, clipboard, ABC, DEF, All   ; Ersetzt alle Vorkommen von ABC mit DEF (und wandelt die Zwischenablage in Klartext um).

ClipWait verwenden, um die Zuverlässigkeit des Skripts zu verbessern:

clipboard =  ; Beginnt leer, damit ClipWait erkennt, wenn der Text angekommen ist.
Send ^c
ClipWait  ; Wartet, bis die Zwischenablage Text enthält.
MsgBox STRG+C hat folgenden Inhalt in die Zwischenablage kopiert:`n`n%clipboard%

ClipboardAll (alles in der Zwischenablage speichern und wiederherstellen)

ClipboardAll enthält alles von der Zwischenablage (z. B. Bilder und Formatierung). Diese Variable wird häufig verwendet, um den aktuellen Inhalt der Zwischenablage zu sichern, damit die Zwischenablage vorübergehend für eine andere Operation verwendet werden kann. Sobald die Operation abgeschlossen wurde, kann der originale Inhalt der Zwischenablage wie folgt wiederhergestellt werden:

ClipSicherung := ClipboardAll   ; Speichert die gesamte Zwischenablage in eine beliebige Variable.
; ... hier kann vorübergehend die Zwischenablage anderweitig verwendet werden, z. B. das Einfügen von Unicode-Text mit Transform Unicode ...
Clipboard := ClipSicherung   ; Originale Zwischenablage wiederherstellen. Beachtet, dass Clipboard verwendet wird (nicht ClipboardAll).
ClipSicherung =   ; Speicher freigeben, falls die Zwischenablage sehr groß war.

ClipboardAll könnte auch in einer Datei gespeichert werden (im diesen Modus wird FileAppend die vorhandene Datei immer überschreiben):

FileAppend, %ClipboardAll%, C:\Firmenlogo.clip ; Die Dateierweiterung spielt hierbei keine Rolle.

Das folgende Beispiel zeigt, wie die Datei später wieder in die Zwischenablage (oder in eine Variable) geladen werden kann:

FileRead, Clipboard, *c C:\Firmenlogo.clip ; Beachtet, dass *c vor dem Dateinamen stehen muss.

Hinweise

ClipboardAll ist leer, sobald es nicht wie oben beschrieben verwendet wird. Darüber hinaus wird ClipboardAll nicht in kommagetrennten Ausdrücken unterstützt; das heißt, dass diese Variable alleine auf einer Zeile stehen muss, wie z. B. ClipSicherung := ClipboardAll.

Variablen, denen ClipboardAll zugewiesen worden ist, sind im Binärformat und werden z. B. in einer MsgBox als Kauderwelsch angezeigt. Zudem wird eine Variable mit binärer Zwischenablage in eine normale Variable zurückverwandelt, sobald sie in irgendeiner Form verändert wird (z. B. durch StringReplace), wodurch sie folglich ihre Daten von der Zwischenablage verliert. [v1.0.46+]: Variablen mit binärer Zwischenablage können als Wert an eine Funktion übergeben werden (vorher hat das nur mit ByRef funktioniert).

Falls ClipboardAll nicht in der Lage ist, eine oder mehrere Datenobjekte (Formate) von der Zwischenablage abzurufen, werden die Objekte ausgelassen und die restlichen gespeichert.

Eine Variable, die Daten von der Zwischenablage enthält, kann wie folgt in eine andere Variable kopiert werden: ClipSicherung2 := ClipSicherung.

Mit ClipWait kann festgestellt werden, wann die Zwischenablage Daten enthält (wahlweise auch Daten, die kein Text sind).

StrLen / StringLen kann dazu verwendet werden, die Gesamtgröße einer Variable zu ermitteln, der ClipboardAll zugewiesen worden ist. Um die Größe bei den Unicode-Versionen von AutoHotkey abzurufen (in Bytes), muss die Länge mit 2 multipliziert werden. A_IsUnicode kann verwendet werden, um ANSI- und Unicode-Versionen zu unterstützen. Zum Beispiel: Größe := StrLen(ClipSicherung) * (A_IsUnicode ? 2 : 1).

Variablen, denen ClipboardAll zugewiesen worden ist, können mit den Operatoren "<>" und "=" miteinander verglichen werden (aber nicht direkt mit ClipboardAll). Im folgenden Beispiel wird zunächst die Länge jeder Variable überprüft. Falls das nicht reicht, können die Variablen noch wie folgt verglichen werden:

if ClipSicherung1 <> %ClipSicherung2%   ; Muss eine IF-Anweisung im alten Stil sein, kein Ausdruck.
    MsgBox Die zwei gespeicherten Zwischenablagen sind unterschiedlich.

Das Speichern von ClipboardAll in eine Variable wird nicht durch das Speicherlimit von #MaxMem beeinflusst.

Eine intern gespeicherte Zwischenablagedatei besteht aus mehreren Teilen: Die ersten 4 Bytes enthalten den Formattyp, die nächsten 4 Bytes die Datenblockgröße und zum Schluss den Datenblock des Formats. Falls die Zwischenablage mehr als ein Format enthält (dass fast immer der Fall ist), werden diese drei Elemente so oft wiederholt, bis alle Formate enthalten sind. Anschließend endet die Datei mit einem Formattyp (4 Byte groß), wobei jedoch eine 0 enthalten ist.

Bekannte Einschränkung: Sobald ClipboardAll abgerufen wird, während Zellen von MS Excel enthalten sind, kann es passieren, dass in Excel ein Dialogfenster mit "Keine Drucker" angezeigt wird.

Zwischenablage-Programme, die mit AutoHotkey programmiert wurden:

OnClipboardChange

Skripte können mithilfe von OnClipboardChange Änderungen in der Zwischenablage erkennen.