Screenshot per Makro

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

erikafuchs
******
Beiträge: 666
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Screenshot per Makro

Beitrag von erikafuchs »

Kann man per Makro einen Screenshot erzeugen?
... und den dann möglicherweise auch noch abspeichern?
craig22
***
Beiträge: 98
Registriert: Mi, 19.08.2020 13:47

Re: Screenshot per Makro

Beitrag von craig22 »

Hallo,

da man mit der Druck-Taste eine Screenshot in die Zwischenablage kopieren kann,
als auch mittels [ALT]+[DRUCK] ein vordergründiges Fenster kopieren kann, würde ich
es mal mitt einem KeyEvent-Handler versuchen:
https://forum.openoffice.org/en/forum/v ... 20&t=45516

Hier eine Liste der KeyCodes für LibreOffice:
https://api.libreoffice.org/docs/idl/re ... ction.html
https://api.libreoffice.org/docs/idl/re ... _1Key.html

Hier ein Makro um den Screenshot aus der Zwischenablage in ein Writerdokument einzufügen, etc...

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit

REM ════════════════════════════════════════════════════════════════════════
REM
REM		WRITER:	Bild aus Zwischenablage einfuegen und Anker-Konstante setzen
REM 1)	[Bild einfuegen]
REM ════════════════════════════════════════════════════════════════════════

REM 1)
Sub [Bild einfuegen]
Dim oDoc As Object
Dim oDPage As Object
Dim oShape As Object
Dim oSel as Object

Dim aPoint As New com.sun.star.awt.Point
Dim aSize As New com.sun.star.awt.Size
Dim NewPos As New com.sun.star.awt.Point

Dim nHeight As Long
Dim nWidth As Long

rem ----------------------------------------------------------------------
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 ----------------------------------------------------------------------
rem BIld aus Zwischenablage einfügen
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


REM Position und Groesse festlegen
REM 1000 = 1cm
aPoint.x = 3000
aPoint.y = 3000
aSize.Width = 5000
aSize.Height = 3000

	oDoc=ThisComponent

		' markiertes Bild erfassen
		oSel=oDoc.currentController.Selection
'		xray osel
		oShape=oSel.getByIndex(0)
		
		' Die Eigenschaften des Textfeldes festlegen
		With oShape

REM Groesse und Position des Textfeldes (Maße siehe weiter oben)
			.Size = aSize
			.Position = aPoint				

REM ---------- Alle Konstanten müssen in Großbuchstaben geschrieben werden -----------------
REM Konstanten für den Umlauf, etc. (TextWrap)
REM NONE				→	text does not flow around the object.  
REM THROUGHT		→	text flow ignores the object.  
REM PARALLEL			→	text flows to the left and right of the object.  
REM DYNAMIC			→	text flow depends on the situation. The text formatting decides the best way.  
REM LEFT					→	text flows to the left side of the object.  
REM RIGHT				→	text flows to the right side of the object.  
'			.TextWrap = com.sun.star.text.WrapTextMode.THROUGHT

REM Konstanten für die Verankerung
REM AT_PARAGRAPH		→	am Absatz
REM AT_PAGE					→	an der Seite
REM AT_CHARACTER		→	am Zeichen
REM AS_CHARACTER		→	als Zeichen	
			On Error Goto Ende
			.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH ' am  Absatz
			
REM ----------------------------------------------------------------------------------------
		End With
Ende:

End Sub
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.0.3 (x64) • AOO 4.1.8
erikafuchs
******
Beiträge: 666
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Screenshot per Makro

Beitrag von erikafuchs »

Hallo Craig,
möglicherweise bin ich ja wieder mal auf dem falschen Weg, aber mit dem Keyhandler kann ich doch nur überprüfen, welche Taste gedrückt wurde (Da könnte ich stattdessen meine User ja auch einfach auffordern, die "Druck"-Taste zu betätigen (zumindest in Windows)). Der Screenshot soll aber aus dem Programm heraus erzeugt werden. Zur Erklärung: Normalerweise werden die Eingaben und Fehler in meinem Rechentrainer (den kennst du ja) auf einem Tabellenblatt protokolliert. Jetzt habe ich aber für meine Testoption (mit deren Hilfe Tests geschrieben werden können), Dialoge erstellt, mit denen die schriftliche Rechnung nachgestellt wird. Da könnten jetzt ganz Schlaue, das Endergebnis mit dem Taschenrechner berechnen und die Zwischenschritte weglassen. Mein Makro überprüft die Zwischenschritte und im Protokoll stünde dann, dass das richtige Ergebnis eingegeben wurde, die Rechnung aber falsch ist.
Das sieht bei der Multiplikation etwa so aus:
Zwischenablage01.jpg
Zwischenablage01.jpg (66.02 KiB) 469 mal betrachtet
Damit dies vom Lehrer nachvollzogen werden kann, wollte ich dann jeweils einen Screenshot erzeugen (Mit der Druck-Taste sind erfahrungsgemäß einige Schülerinnen und Schüler überfordert.
craig22
***
Beiträge: 98
Registriert: Mi, 19.08.2020 13:47

Re: Screenshot per Makro

Beitrag von craig22 »

Hallo,

mein Gedankengang ist, nicht die Drucktaste per Handler zu prüfen, sondern die Drucktaste, bzw. [ALT]+[Druck] per Makro zu betätigen.
Hierfür habe ich allerdings kein Beispiel parat.

Hätte ich besser beschreiben sollen, sorry.

Also, [Druck] per Makro und dann weiter mit dem [Bild Einfuegen] Makro.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.0.3 (x64) • AOO 4.1.8
erikafuchs
******
Beiträge: 666
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Screenshot per Makro

Beitrag von erikafuchs »

mein Gedankengang ist, nicht die Drucktaste per Handler zu prüfen, sondern die Drucktaste, bzw. [ALT]+[Druck] per Makro zu betätigen.
... ja, zum Beispiel (zumindest unter Windows) - aber wie?
craig22
***
Beiträge: 98
Registriert: Mi, 19.08.2020 13:47

Re: Screenshot per Makro

Beitrag von craig22 »

Hallo,
... ja, zum Beispiel (zumindest unter Windows) - aber wie?
Ich kann Dir leider keine direkte Lösung anbieten, zumindest nicht mit AOO-/ LibO-Boardmitteln.
In der API der Key-Constant-Groups habe ich keinen Hinweis auf die Nutzung der "Druck-Taste" (engl.: PRTSC) gefunden.
So habe ich ersteinmal bei MS nachgesehen, ob man sich ggf. mit der Sendkeys-Methode dem Problem nähern kann.
Ich habe dann ein VBS-Script gefunden, allerdings verweigert WIN 10 hierbei seinen Dienst.

Durch Zufall bin ich darüber gestolpert, das Irfanview eine Kommandozeilen-Steuerung anbietet.
Siehe IrfanView-Hilfe → Kommandozeile.
Damit dies funktioniert muss eine jpg-Datei namens xxnew.jpg im Ordner C:\temp
gespeichert sein, sonst meldet Irfanview einen Fehler.
Es handelt sich hierbei um eine temporäre Datei, welche immer wieder mit einem neuen Screenshot beschrieben wird.
Ich habe in der IrfanView-Hilfe keine Lösung gefunden, um ohne die temporäre Datei zu arbeiten.

Das Resultat ist dies:
Irfanview Screenshot.ods
(12.13 KiB) 7-mal heruntergeladen
Da AOO und LiBo mal wieder nicht so richtig wollten, musste ich eine IF-Anweisung uzr Verifizierung des Office-Typs einbauen,
sonst funktioniert das Einfügen des Bildes aus der Zwischenablage nicht oder nur sporadisch.
Das sporadiscche Verhalten ist aber auch von den implementierten WAIT-Anweisungen abhängig.
Man muss der Shell (Windows-Kommandozeile) und Irfanview Zeit zum Speichern geben.
Dies ist wiederum vom verwendeten Rechner, Arbeitsspeicher und der eingesetzten Festplatte abhängig.
Bei mir:
Intel i5
Ram 16 GB
SSD 1,0TB

Ob dies nun eine Lösung ist , weiß ich nicht.
Ggf. hat noch jemand anderes eine Idee?
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.0.3 (x64) • AOO 4.1.8
erikafuchs
******
Beiträge: 666
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Screenshot per Makro

Beitrag von erikafuchs »

Hallo Craig,
prima, Kompliment, da hast du dich aber wieder mal richtig reingeschafft. Das funktioniert! ... aber wohl auch nur, wenn IrfanView64 auf dem jeweiligen Computer installiert ist und nur unter Windows. Ich glaube, ich werde jetzt im geschilderten Fall einfach eine Nachricht ausgeben, dass der/die Nutzer/in, händisch einen Screenshot erstellen und speichern sollen, falls sie mit dem Punktabzug nicht einverstanden sind. Eigentlich sollten die Kids das auch können, bzw. lernen. Es hätte ja aber sein können, dass es eine einfache und sichere Möglichkeit gegeben hätte die das Gewünschte direkt aus StarBasic hätte erldigen können.
Aber ansonsten ist deine Lösung prima und kann sie vielleicht auf dem heimischen Computer einsetzen.
Pit
craig22
***
Beiträge: 98
Registriert: Mi, 19.08.2020 13:47

Re: Screenshot per Makro

Beitrag von craig22 »

Hallo Pit,

danke für das Kompliment.
Es hätte ja aber sein können, dass es eine einfache und sichere Möglichkeit gegeben hätte die das Gewünschte direkt aus StarBasic hätte erldigen können.
Ja, dass wäre auch mein Wunsch, denn ich könnte eine solche Methode auch gebrauchen.
Ggf. befindet sich in den Tiefen der API eine Möglichkeit Screenshots zu erstellen,
man müsste halt "nur" das vordergründige Frame erfassen und dann fotografieren.

Ich habe dazu mittels XRAY Frames inspiziert, konnte aber keine Methode dazu finden.

Deshalb war mein erste Gedanke, den Key-Event-Handler "zu verbiegen", um damit einen Tastendruck auszulösen.
Hat aber auch nicht funktioniert.
Das liegt sicherlich daran, dass ich kein Profi-Programmierer bin :(

Python ist hierbei wesentlich mächtiger, dass beherrsche ich nicht.
Ich denke hierbei daran, dass man aus Basic heraus ein Python-Script anstößt, welches dann die Drucktaste simuliert.
https://stackoverflow.com/questions/182 ... on-windows
https://pypi.org/project/keyboard/
oder per Powershell:
https://stackoverflow.com/questions/549 ... -tab-enter
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.0.3 (x64) • AOO 4.1.8
erikafuchs
******
Beiträge: 666
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Screenshot per Makro

Beitrag von erikafuchs »

Nun ja, das Python Handbuch habe ich schon und eingelesen habe ich mich auch schon. Python gefällt mir gut. Ich möchte jetzt aber meinen Rechentrainer als App entwickeln und bin dabei auf Kotlin gestoßen, damit kann man wohl Apps sowohl für Android als auch für IOS entwickeln. Dafür habe ich jetzt das Python Handbuch zurseite gelegt und mich in Kotlin eingelesen, das scheint mir allerdings bedeutend anspruchsvoller. Mal sehen, wieweit ich das schaffe.
Hiker
*****
Beiträge: 464
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Screenshot per Makro

Beitrag von Hiker »

Am Ende des folgenden Links ist ein Python-script verlinkt. Ich gerade nur nicht sicher, ob PIL/Pillow beim Python in LibreOffice direkt dabei ist.

https://superuser.com/questions/412293/ ... on-desktop


Erstaunlich finde auch auch das im folgenden erwähnte Screenshot.bat

https://superuser.com/questions/75614/t ... 947#943947
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
erikafuchs
******
Beiträge: 666
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Screenshot per Makro

Beitrag von erikafuchs »

Auch interessant! Jetzt aber wieder eine blöde Frage: Dass Python (ein Compiler?) in OO/LO schon eingebunden ist, habe ich gelesen - kann ich denn einfach Pythoncode in mein Basic Code einbinden?
Karolus
********
Beiträge: 7136
Registriert: Mo, 02.01.2006 19:48

Re: Screenshot per Makro

Beitrag von Karolus »

Nein das kannst du nicht!
Version: 6.1.5.2
Build-ID: 1:6.1.5-3+rpi1+deb10u6+rpt1
raspberry-pi-OS
Hiker
*****
Beiträge: 464
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Screenshot per Makro

Beitrag von Hiker »

erikafuchs hat geschrieben: Sa, 16.10.2021 16:19 ...Dass Python (ein Compiler?) in OO/LO schon eingebunden ist, habe ich gelesen - kann ich denn einfach Pythoncode in mein Basic Code einbinden?
Python wird normalerweise - wie auch BASIC - interpretiert, also zeilenweise abgearbeitet, auch wenn es da heute Mischformen gibt.

Normalerweise: Entweder Basic oder Python. Zusammenarbeit ist möglich aber kompliziert.

J.
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Stephan
********
Beiträge: 12317
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Screenshot per Makro

Beitrag von Stephan »

Ich mache seit einigen Wochen die ersten ernsthafteren Schritte mit Python in einem Datenbankprojekt in Kombination von Python mit StarBasic. Das Python lernen fällt mir schwer, aber die Zusammenarbeit von Python und StarBasic ist eigentlich einfach.

Wenn Du (in Anlehnung an das mit OO/LO mitgelieferte Python-HelloWorld-Beispiel) folgenden Python-Code hast:

Code: Alles auswählen

def erzeuge_writerdoc( ):
    desktop = XSCRIPTCONTEXT.getDesktop()
    doc = desktop.loadComponentFromURL(
            "private:factory/swriter","_blank", 0, () )
    text = doc.Text
    tRange = text.End
    tRange.String = "Hello World (von Python)"   
    return doc
und das in der Datei .../user/Scripts/python/ErzeugeWriterDokument.py (im OO/LO-Benutzerverzeichnis) gespeichert hast, kannst Du das von StarBasic aus so aufrufen:

Code: Alles auswählen

Sub Main
	oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
	g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("")
	oScript = g_MasterScriptProvider.getScript("vnd.sun.star.script:ErzeugeWriterDokument.py$erzeuge_writerdoc?language=Python&location=user")
	RS_Python = oScript.invoke(Array(),Array(),Array())
	
	cur = RS_Python.text.CreateTextcursor
	
	cur.GotoEnd(False)
	cur.String = CHR(13) & "Hello World (von StarBasic)"
End Sub
und erhälst ein Dokument, dessen Inhalt teils von Python, teils von StarBasic erzeugt wurde.



Gruß
Stephan
Karolus
********
Beiträge: 7136
Registriert: Mo, 02.01.2006 19:48

Re: Screenshot per Makro

Beitrag von Karolus »

Hallo
Zunächst, habe ich die Frage von @erikafuchs so verstanden, das er BASIC und Python im Quelltext mischen möchte, (etwa so wie das in html mit eingebetteten JavaScript gemacht wird) und das geht eben nicht.


@Stephan:
Das ist jetzt zwar ein interessantes Beispiel - aber da kann|sollte ich mich doch vorher entscheiden ob ich Basic oder Python benutzen will.
Stephan hat geschrieben:…aber die Zusammenarbeit von Python und StarBasic ist eigentlich einfach.
ich finde dieses ScriptProvidergewurstel extrem lästig und zudem musst du den aufrufenden Code je nachdem wo (in einem Document oder nicht) der Code lokalisiert ist, (ich meine NICHT die ScriptURI) unterschiedlich schreiben!
Version: 6.1.5.2
Build-ID: 1:6.1.5-3+rpi1+deb10u6+rpt1
raspberry-pi-OS
Antworten