OnClipboardChange, Zwischenablage überwachen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 233
Joined: 21 Aug 2018, 11:11

OnClipboardChange, Zwischenablage überwachen

Post by KHA » 21 Jul 2020, 17:32

Hallo zusammen,
möchte folgendes umsetzen, habe eine Liste, jedes mal wenn ich ein Text kopiere, soll der Inhalt der Zwischenablage überprüft werden, ob der erste Teil aus meiner Liste in der Zwischenablage vorkommt, wenn ja, dann soll es durch den 2. Teil ersetzt werden.
(Hoffe habe ich mich verständlich ausgedrückt)

Wenn ich es kopiere, ruft sich die Funktion mehrmals auf, liegt wahrscheinlich daran, dass sich die Zwischenablage jedes mal ändert.
Wie verhindere ich das?
Wenn Script läuft, kann ich keine dateien kopierren, (hat wahrscheinlich auch damit zu tun, das die Funktion sich mehrmals aufruft). wie kann ich das ausschließen.

Hier ist mein Script:

Code: Select all


#Persistent
OnClipboardChange("ZwischenablageG")
Return



ZwischenablageG(1) {
TableText=
(join`r`n

;Liste die gesucht und ersetzt werden soll
alt="Person"::1
<p>:<p class="beispiel">:0
<ul>:<ul class="beispiel">:

)

MsgBox, %Clipboard%

;Zwischenablage von Leerzeilen bereinigen
Clipboard := RegExReplace(Clipboard, "(^|\R)\K\s+")
Clipboard := Trim(Clipboard, "`r, `n, `r`n")

	Loop, parse, TableText, `n, `r
	{


	TeileZeile := StrSplit(A_LoopField, ":", "`r`n")
	SucheText := TeileZeile[1]
	ErsetzeText := TeileZeile[2]
	MeldungAktiv := TeileZeile[3]
		

		if (MeldungAktiv = 1) && InStr(Clipboard, SucheText)
		{
		Clipboard := StrReplace(Clipboard, SucheText, ErsetzeText)
		MsgBox , 0, Zwischenablage enthält..., %SucheText% wird durch %ErsetzeText% ersetzt.  , 3
		} Else if ( (MeldungAktiv = 0) OR (MeldungAktiv = "") ) && InStr(Clipboard, SucheText)
		{
		Clipboard := StrReplace(Clipboard, SucheText, ErsetzeText)
		} 
	}


}



Und danke schon mal

just me
Posts: 7227
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: OnClipboardChange, Zwischenablage überwachen

Post by just me » 22 Jul 2020, 04:08

Moin,

meiner Meinung nach ist es keine gute Idee, bei jeder Änderung des Clipboards automatisch eine Routine zu starten, die das Clipboard ändern kann.

Clipboard ist keine 'normale' AHK Variable sondern bezieht sich immer auf das 'echte' Clipboard. Wenn überhaupt, solltest Du zu Beginn Deiner Routine den Inhalt des Clipboards in eine Variable kopieren, diese Variable bearbeiten und am Ende ins Clipboard zurückschreiben, falls tatsächlich etwas geändert wurde. Du solltest Dir dafür auch die Beschreibung des Parameters der OnClipboardChange-Funktion anschauen.

Man kann den Aufruf der OnClipboardChange-Funktion übrigens jederzeit per

Code: Select all

OnClipboardChange("ZwischenablageG", 0)
ausschalten und dann mit

Code: Select all

OnClipboardChange("ZwischenablageG", 1)
wieder einschalten.

BoBo
Posts: 3642
Joined: 13 May 2014, 17:15

Re: OnClipboardChange, Zwischenablage überwachen  Topic is solved

Post by BoBo » 22 Jul 2020, 08:20

AFAIK macht HTML-Befrickelung erst mit RegEx einigermaßen Spass. Dann eben lustlos ...

Code: Select all

#Persistent

Global arr := StrSplit("alt=""Person""::1,<p class="beispiel">:<p class=""beispiel"">:0,<ul class="beispiel">:<ul class=""beispiel"">:",",")

OnClipboardChange("ZwischenablageG")
Return

ZwischenablageG(type) {
	;	Clipboard := RegExReplace(Clipboard, "(^|\R)\K\s+")		; ??
	;	Clipboard := Trim(Clipboard, "`r, `n, `r`n")			; ??
	If (type = 1)
	Loop % arr.Length()
		ClipBoard := InStr(ClipBoard,StrSplit(arr[A_Index],":").1) ? StrReplace(ClipBoard,StrSplit(arr[A_Index],":").1, StrSplit(arr[A_Index],":").2) : ClipBoard
	MsgBox, %Clipboard%
	}

/*				; zur laufzeit mit Ctrl+c kopiert
	; wird gemäß arr[1] zweitem, mit : -separiertem item das feld leer ausgegeben
<p class="beispiel">				; wird zu <p class="beispiel"> ersetzt
<ul class="beispiel">			; wird zu <ul class="beispiel"> ersetzt
*/

KHA
Posts: 233
Joined: 21 Aug 2018, 11:11

Re: OnClipboardChange, Zwischenablage überwachen

Post by KHA » 22 Jul 2020, 12:06

@just me Danke, jetzt verstehe ich, was die Doku mir sagen will
HinzufügenEntfernen
Geben Sie einen der folgenden Werte an:
1 (Standard): Rufen Sie die Funktion nach anderen zuvor registrierten Funktionen auf.
-1: Rufen Sie die Funktion vor anderen zuvor registrierten Funktionen auf.
0: Rufen Sie die Funktion nicht auf.
@BoBo Danke, funktioniert Wunderbar!

Habe etwas angepasst, für das was ich vorhabe, reicht mir vollkommen.

Code: Select all

#Persistent
Global arr := StrSplit("alt=""Person""::1,<p>:<p class=""beispiel"">:0,<ul>:<ul class=""beispiel"">:" , ",")

OnClipboardChange("ZwischenablageG", 1)
Return

ZwischenablageG(type) {
FileFolderCheck := FileExist(Clipboard)
	If (type = 1) && (FileFolderCheck = "")
	Loop % arr.Length()
		ClipBoard := InStr(ClipBoard,StrSplit(arr[A_Index],":").1) ? StrReplace(ClipBoard,StrSplit(arr[A_Index],":").1, StrSplit(arr[A_Index],":").2) : ClipBoard
;MsgBox, % Clipboard

	}


just me
Posts: 7227
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: OnClipboardChange, Zwischenablage überwachen

Post by just me » 24 Jul 2020, 04:48

Moin KHA,

mein Beitrag sollte Dir eigentlich noch etwas mehr sagen.

Mehrfache Änderungen des Inhalts des Clipboards in einer OnClipboardChange-Funktion stelle ich mir eher so vor (nicht wirklich getestet):

Code: Select all

#Persistent
Global Arr := StrSplit("alt=""Person""::1,<p>:<p class=""beispiel"">:0,<ul>:<ul class=""beispiel"">:", ",")
OnClipboardChange("ZwischenablageG", 1)
Return

ZwischenablageG(Type)
{
   If !(Type = 1) ; das Clipboard enthält keinen Text
      Return
   ClipAlt := Clipboard ; <<<<< 1. Zugriff auf das Clipboard
   If FileExist(ClipAlt) ; das Clipboard enthält einen Dateinamen
      Return
   ClipNeu := ClipAlt ; für die spätere Prüfung, ob etwas geändert wurde
   For Each, Item In Arr
   {
      MsgBox, %item%
      S := StrSplit(Item, ":")
      ClipNeu := StrReplace(ClipNeu, S[1], S[2])
   }
   If !(ClipNeu = ClipAlt) ; der Inhalt wurde verändert
   {
      ; OnClipboardChange("ZwischenablageG", 0) ; Kür: OnClipboardChange abschalten
      Clipboard := ClipNeu ; <<<<< ggf. 2. Zugriff auf das Clipboard
      ; OnClipboardChange("ZwischenablageG", 1) ; Kür: OnClipboardChange wieder einschalten
   }
   ; MsgBox, %Clipboard%
}

KHA
Posts: 233
Joined: 21 Aug 2018, 11:11

Re: OnClipboardChange, Zwischenablage überwachen

Post by KHA » 24 Jul 2020, 13:23

@just me Danke, dass du dir Mühe gibst um mir etwas zu erklären.
Jetzt habe ich es verstanden :)

Post Reply

Return to “Ich brauche Hilfe”