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, verwenden Sie 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 := ""  ; Vorerst 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 (in diesem 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.

Einschränkungen

Es gelten einige Einschränkungen bei der direkten Verwendung von ClipboardAll:

Eine Variable, die binäre Zwischenablagedaten enthält, kann wie folgt genutzt werden:

Es gelten weitere Einschränkungen:

Hinweise

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

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

StrLen() kann genutzt werden, um die Gesamtgröße einer Variable zu ermitteln, der ClipboardAll zugewiesen wurde. 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 wurde, können mittels If[Not]Equal, If Var1 = %Var2% oder If Var1 != %Var2% 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 (für 32-Bit) oder 8 Bytes (für 64-Bit) 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 mittels OnClipboardChange() oder OnClipboardChange-Label Änderungen in der Zwischenablage erkennen.