Seite 1 von 1

Probleme beim Clipboard auslesen

Verfasst: Do, 26.01.2006 11:38
von Vegeta
Ich habe in meinen Makros folgende Routine eingebaut, um das Clipboard auslesen zu können:

Code: Alles auswählen

Global Function GetClipboard() as string 
	on error resume next 
	dim ClipBoardHandle, DataObj, DataTypSeq

	' Routine fürs Clipboard
	ClipBoardHandle = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
	DataObj = createUnoService("com.sun.star.datatransfer.XTransferable")
	DataObj = ClipBoardHandle.getContents()   
	DataTypSeq = DataObj.getTransferDataFlavors()   'Array aller Inhalte
	GetClipboard = DataObj.getTransferData(DataTypSeq(0)) 
end function
Das funktioniert allerdings nur sehr eingeschränkt. Obwohl Text in der Zwischenablage vorhanden ist, wird dieser nicht zurückgegeben, das funktioniert nur, wenn der Text in Write selber kopiert wurde oder in ganz seltenen Fällen auch mit anderen Anwendungen.

Alles in allem ist diese Methode nicht brauchbar, weil eben wie gesagt nur in den seltensten Fällen läuft.
Daraufhin habe ich mal den Makro-Rekorder eingeschaltet und der hat mir dann diesen Vorschlag gemacht, der auch 100%ig läuft.

Code: Alles auswählen

Global Sub Clipboard_einfuegen()
	rem ----------------------------------------------------------------------
	rem define variables
	dim document   as object
	dim dispatcher as object
	rem ----------------------------------------------------------------------
	rem get access to the document
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	rem ----------------------------------------------------------------------
	dim args1(0) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "SelectedFormat"
	args1(0).Value = 1
	
	dispatcher.executeDispatch(document, ".uno:ClipboardFormatItems", "", 0, args1())

end sub
Das einzige Problem, was ich mit diesem Code habe, ist, daß ich gerne den Inhalt der Zwischenablage in eine Variable speichern würde (um dort weiter zu verarbeiten) und nicht gleich sofort ins Dokument einfügen würde.

Weiß jemand was ich machen muß, damit entweder der erste Code richtig geht oder damit das zweite Beispiel meinen Wünschen entsprechend läuft?

Vielen Dank!
Gruß,
Vegeta

Verfasst: Do, 26.01.2006 13:08
von Toxitom
Hey Vegeta,
Das funktioniert allerdings nur sehr eingeschränkt. Obwohl Text in der Zwischenablage vorhanden ist, wird dieser nicht zurückgegeben, das funktioniert nur,
Na ja, das funktioniert schon, nur ist die Arbeit mit dem Clipboard nicht "ganz einfach" :wink:
Das Systemclipboard kann eben unterschiedliche Okjekte aufnehmen und der Array hat alle drin. Du liest nur den ersten Eintrag aus, und das ist jetzt echt Glückssache, was du "erwischt" hast. "PlainText" nur dann, wenn die Applikation, aus der du die Zwischenablage gefüllt hast, eben "nur" PlainText hineinkopiert hat (bsp. Notepad in Windows liefert lediglich "Text"), und nur "plainText" kannst du in eine Variable einlesen und ausgeben.
Kopierst du aus Writer, werden zunächst diverse Objekte eingefügt, der "PlainText" taucht erst (glaube ich, zur Not nachprüfen :wink: ) als 3. oder 4. Arrayeintrag auf.
Tia, und so ist das in anderen Applikationen eben auch. Die kopieren auch erst einmal "Objekte" in die Zwischenablage, und jetzt müsstest du diese theoretisch analysieren, dir das "richtige" raussuchen und dann entsprechend weiterverarbeiten.

Das ist alles ziemlich kompliziert - leider hab ich auch keine Code-Beispiele (außer einem, das ähnlich wie deins arbeitet).

Viele Grüße
Thomas

Verfasst: Do, 26.01.2006 18:00
von Vegeta
Danke für deine Antwort Toxitom! Hab's getestet und du hast Recht, ich habe mir mal die Inhalte des Arrays bis 6 ausgeben lassen und da war wirklich das Gesuchte drin, sogar mehrmals.
Also bräuchte ich eigentlich nur durch das Array zu loopen und beim ersten Match, da wo es nicht leer ist, einfach den Inhalt auszulesen.

Aber wie bekomme ich denn die Länge des Arrays raus?

Code: Alles auswählen

	msgbox UBound(DataObj.getTransferData(DataTypSeq()))
Geht z.B. nicht.

Viele Grüße,
Vegeta

Verfasst: Do, 26.01.2006 18:22
von Toxitom
Hey Vegeta,
Aber wie bekomme ich denn die Länge des Arrays raus?
Loop über while hasMoreElements()" ?

Ist geraten. Nutze einfach so ein Objekt-Inspektionstool (X-Ray?) um zu prüfen, welche Varianten unterstützt werden :-)

Gruss
Thomas

Verfasst: Sa, 28.01.2006 11:36
von Vegeta
Danke dir für den Tip, werde ich mal testen :)