Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Clipboard Class v2.1


  • Please log in to reply
7 replies to this topic
nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich habe mich ein bischen mit den Clipboard dlls beschäftigt.
Entstanden ist eine Lib die mehr Möglichkeiten bietet als die AHK clipboard Verwaltung.
Sie kann den Inhalt des Clipboards hauptsächlich speichern und wiederherstellen.
WARNING: No Warranty: Das Skript ist noch ziemlich neu und ich kann Fehler nicht ausschliessen.

    Class clip
    {
    maxsaves:=20	
     
    __new()
    {
    this.saves:=[]
    }	
    
	Save(){
	a:=this.SaveAllClipboardData()
    return this.saves.insert(a)
    }
     
    Restore(index=1,preferedtype="")
    {
    this.RestoreAllClipboardData(this.saves[index],preferedtype)
    }
     
    Deletesave(index=1)
    {
    For each, savestype in this.saves[nr]
    DllCall("GlobalFree","ptr",savestype)
    this.saves.remove(nr)
    return nr
    }
     
	SaveAllClipboardData()
	{
	c:={}
	DllCall("OpenClipboard")
	while n:=DllCall("EnumClipboardFormats","Int",n?n:0)
	c[n]:=(this.SaveClipboard(n))
	DllCall("CloseClipboard")	
	return c
	}

	RestoreAllClipboardData(c,preferedtype="")
	{
	DllCall("OpenClipboard")
	DllCall("EmptyClipboard")
	If (preferdtype&&c[preferedtype])
		this.restoreClipboard(preferedtype,c[preferedtype])
	for each,val in c
		this.restoreClipboard(each,val)
	DllCall("CloseClipboard")	
	}

	SaveClipboard(type)
	{
	hMem:=0
	If DllCall("IsClipboardFormatAvailable","UInt",type)
		hMem:=DllCall("GetClipboardData","UInt",type)
	if !hmem
		return 0
	if !s:=DllCall("GlobalSize","ptr",hmem)
		return 0
	pm:=DllCall("GlobalAlloc","UInt",0,"ptr",s)
	pmem:=DllCall("GlobalLock","ptr",hmem)
	DllCall("RtlMoveMemory","ptr",pm,"ptr",pmem,"ptr",s)
	DllCall("GlobalUnlock","ptr",hMem)
	return pm
	}
 
	RestoreClipboard(type,pm)
	{
	s:=DllCall("GlobalSize","ptr",pm)
	hMem:=DllCall("GlobalAlloc","UInt",2,"ptr",s)
	pmem:=DllCall("GlobalLock","ptr",hmem)
	DllCall("RtlMoveMemory","ptr",pmem,"ptr",pm,"ptr",s)
	DllCall("GlobalUnlock","ptr",hMem)
	hMem:=DllCall("SetClipboardData","UInt",type,"ptr",hMem)
	return hMem
	}
    }

Hier ein Beispiel zur benutzung:

cli:=new clip()
a:=clipboard
cli.save()
cli.restore()
msgbox % (a=clipboard)?"Stimmt:Es ist vorher wie nachher gleich.":"Fehler"

Todo:
Die Ausnahmenverwaltung verbessern.
Mehr austesten.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Also, ich blick leider nicht genau was da passiert und was man damit genau machen kann.

 

Kannst du vllt. so ne Art Befehlsliste hinzufügen und Kommentare? Das wäre super. Dann kann ich mir darunter was vorstellen und es hoffentlich für meine Anwendung nutzen :)

 

Kann man z.b. damit mehrere Clips Speichern? Ist es möglich als Feedback zu erhalten was gespeichert wurde? Also ob Text oder Bild?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Mit dem Befehl   

Save()

Speichert die Class den momentanen Inhalt des Clipboards.

Der Returnwert ist die Speichernummer:

z.B. in unserem Beispiel

Mit dem Befehl

Restore(nr=1,preferedtype=0)

Kann man eine Speicherung wiederherstellen indem man die Nummer angibt.

Preferedtype ändert den Typ von Daten der als erstes benutzt werden soll.

Z.B. kann man wenn man Formatierten Text als Typ hinzufügt Text sowie Formatierten Text erhalten und um den aufzurufen der weiter hinten in der types-Liste steht gibt man halt die Nummer in dem Parameter preferedtypes an.

DeleteSave(nr=1)

Mit der Funktion löscht man eine Speicherung indem man die Nummer angibt.

Der Returnwert ist die gelöschte Speicherung.

this.types:=[15,2,A_IsUnicode?13:1]

this.types enthält die momentan verwendeten Typen.

In unserem Fall ist es [Datei,Bild,Text/Unicode/Ansi]

this.types darf kann sollte verändert werden.

Die Reihenfloge spielt hierbei eine gewisse Rolle:

Es werden zwar alle Datentypen die man erhalten kann, gespeichert, aber nur der erste Typ wird, wenn nicht anders in preferedtype angegeben, gespeichert.

maxsaves:=20

Gibt die maximale Anzahl an Speicherungen an.

Dieser Wert kann verändert werden.

this.saves:=[]

In this,saves werden die Pointer zu den Daten gespeichert.

Ich empfehle hier nicht reizuschreiben, da man im schlimmsten Falle ein Memory-Leak oder einen Absturz erhält.

 

 

 

SaveClipboard sowie RestoreClipboard sind interne Funktionen.

Sie speichern Den Inhalt des Clipboards und geben einen Pointer zurück oder sie stellen den Inhalt des Clipboards per Pointer wieder her.

 

 

GetType(nr) werde ich noch einbauen die dann die Typen nummer zurückgibt wenn man eine Nummer angibt.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Restore(nr=1,preferedtype=0)

Kann man eine Speicherung wiederherstellen indem man die Nummer angibt.

Preferedtype ändert den Typ von Daten der als erstes benutzt werden soll.

Z.B. kann man wenn man Formatierten Text als Typ hinzufügt Text sowie Formatierten Text erhalten und um den aufzurufen der weiter hinten in der types-Liste steht gibt man halt die Nummer in dem Parameter preferedtypes an.

 

Kannst du das mit dem preferedtype noch genauer beschreiben? Mal angenommen ich habe formatierten Text kopiert und möchte diesen einfügen, ich möchte den gleichen Text aber auch unformatiert haben.

Wie genau muss ich da vorgehen?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Das ist im moment mit der Class vieleicht sogar garnicht möglich.

 

Jedes Programm kann nämlich ein eigenes Clipboard Format erstellen welches dann eine Nummer hat.

Diese muss nicht auf jedem Rechner gleich sein.

Z.B. ist bei mir OpenOffice text 49363

 

 

Da diese Class genau diese Nummer dafür braucht ist sie hierfür nutzlos.

Ich habe jedenfalls eine Lösungsidee.

 

Jedoch scheitert Microsoft mal wieder grossartig daran zu dokumentieren:

 

Remarks Das beste ist es mehrere Formate auf einmal zu benutzen.

Es steht dann aber nirgendwo wie man das macht.

 

Edit ich hab es durch rumprobieren rausbekommen. Das rewrite wird aber ein - zwei Stunden dauern.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Vielen Dank für deine Mühen!!!



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Es ist vollbracht.

Es funktioniert genau wie vorher bloss das jetzt alle möglichen typen ermittelt werden.
Ich würde SetBatchlines,-1 benutzen.



Zu preferedtype:
Nun kann man alle in der Clipboard enthaltene Formate speichern und mit preferedtype nur einen zurückgeben.
 
z.B.
Du speicherst Formatierten Text benutzt aber
clip.restore(1,13) ;anstatt clip.restore(1)
Um den Text wiederherzustellen.
Dann wird nur der Text der Gespeichert würde im Unicode text Format übergeben.

Visit the new forum ahkscript.org.

http://ahkscript.org


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich hab einen Bug gefunden und verbessert.


Visit the new forum ahkscript.org.

http://ahkscript.org