staging.inyokaproject.org

Verhindern, dass ein Fenster in den Vordergrund tritt

Status: Ungelöst | Ubuntu-Version: Xubuntu 22.04 (Jammy Jellyfish)
Antworten |

uzfH8

(Themenstarter)
Avatar von uzfH8

Anmeldungsdatum:
3. Mai 2013

Beiträge: 1011

Udalrich schrieb:

Ja, das Entfernen des below-Attributes genügt (mittels toggle oder remove). Auch, wenn man das per wmctrl konfigurierte Programmfenster, Libreoffice in dem Fall, beenden und neu starten würde.

Danke.

Da es aber mit dem Hauptfenster hier funktionierte, kann man da dann nicht doch einen Weg finden? Die erzeugten Fenster sind ja endlich viele, die jedesmal gleich sind. Kann ich da nicht nachsehen, wie das jeweilige Fenster heißt und es dann mit diesem Attribut versehen?

uzfH8

(Themenstarter)
Avatar von uzfH8

Anmeldungsdatum:
3. Mai 2013

Beiträge: 1011

Eine Möglichkeit wäre vielleicht im Makro, bevor der Dialog angezeigt wird, abzufragen ob das LibreOfficefenster im Vordergrund ist. Gibt es eine Möglichkeit zu erfahren, welches Fenster momentan im Vordergrund ist?

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1201

uzfH8 schrieb:

Eine Möglichkeit wäre vielleicht im Makro, bevor der Dialog angezeigt wird, abzufragen ob das LibreOfficefenster im Vordergrund ist. Gibt es eine Möglichkeit zu erfahren, welches Fenster momentan im Vordergrund ist?

Die Idee hatte ich auch, habe aber auf Anhieb nichts gefunden mit dem das schnell gehen würde. Du müsstest mal bitte schauen, ob du im Basic irgend ein Objekt findest, dass die Eigenschaft besitzt den Focused-Status von Libreoffice bzw. deiner jeweiligen Applikation anzuzeigen. In freepascal wäre das z.B. das Objekt Applikation mit der Eigenschaft Active ... if Application.Active then zeige die Messagebox.

Ungetestet:
Der komplizierte Weg wäre vielleicht ...

  1. Den aktiven Fensternamen beim Start des Makros in eine txt-Datei schreiben x = Shell("xdotool getwindowfocus getwindowname > soll.txt")

  2. Bevor die Messagebox aufgerufen wird den aktuell aktiven Fensternamen in eine zweite txt-Datei schreiben x = Shell("xdotool getwindowfocus getwindowname > ist.txt")

  3. Den Inhalt von soll.txt und ist.txt vergleichen und wenn dieser gleich ist die Messagebox aufrufen ansonsten eine Null-Runde drehen ggf. mit einem wait 10000

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1201

sh4711 schrieb:

..., ob du im Basic irgend ein Objekt findest, dass die Eigenschaft besitzt den Focused-Status ...

Ggf. mit dem StarDesktop-Objekt hierzu finde ich aktuell leider keine Property-Auflistung im Netz 😢 oder über das ThisComponent-Objekt

uzfH8

(Themenstarter)
Avatar von uzfH8

Anmeldungsdatum:
3. Mai 2013

Beiträge: 1011

sh4711 schrieb:

sh4711 schrieb:

..., ob du im Basic irgend ein Objekt findest, dass die Eigenschaft besitzt den Focused-Status ...

Ggf. mit dem StarDesktop-Objekt hierzu finde ich aktuell leider keine Property-Auflistung im Netz 😢 oder über das ThisComponent-Objekt

Ich habe phind.com gefragt "What are the properties of the StarDesktop-object in LibreOfice?"

The `StarDesktop` object in LibreOffice represents the LibreOffice application itself. It provides various methods for interacting with the LibreOffice environment, including accessing and managing documents 

... lange Erläuterung von loadComponentFromURL gelöscht ...

2. **CurrentComponent**: This property represents the currently active document. If no document is active, this property is `NULL` [Source 7](https://help.collaboraoffice.com/latest/is/text/sbasic/shared/uno_objects.html).

3. **CurrentController**: This property represents the controller of the currently active document. If no document is active, this property is `NULL` [Source 7](https://help.collaboraoffice.com/latest/is/text/sbasic/shared/uno_objects.html).

4. **CurrentFrame**: This property represents the frame of the currently active document. If no document is active, this property is `NULL` [Source 7](https://help.collaboraoffice.com/latest/is/text/sbasic/shared/uno_objects.html).

5. **Components**: This property represents the collection of all open documents [Source 7](https://help.collaboraoffice.com/latest/is/text/sbasic/shared/uno_objects.html).

6. **Terminate**: This method closes the LibreOffice application [Source 7](https://help.collaboraoffice.com/latest/is/text/sbasic/shared/uno_objects.html).

Ich muss jetzt leider weg.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

uzfH8 schrieb:

Ich habe keinerlei OO-Writer-Macro-Erfahrung und habe mal rumgespielt.

Mein Programm, also das das auf mir läuft, soll so aussehen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Polling
Do while not Zusammenbruch vor Erschöpfung
    arbeite mit Libreoffice
    reset makrofertigflag
    Makro in LibreOffice starten
    Do while not makrofertigfleg
        arbeite mit anderen Programmen
        LibreOffice in den Vordergrund bringen
        set makrofertigflag if Abfrage sichtbar
    Loop
    beantworte abfrage    
Loop

Das ist leider ganz unbrauchbarer Pseudocode. Du hättest Dich ja wenigstens an Deinen eigenen Macrocode anlehnen können und WHILE...WEND statt do while...loop verwenden können.

  • not Zusammenbruch vor Erschöpfung: soll wohl true bedeuten - Endlosschleife.

  • arbeite mit Libreoffice: Das ist BS. Du kannst dem Makro ja nicht sagen, was Du machen sollst.

  • reset makrofertigflag: Und was ist reset? True, False?

  • Makro in LibreOffice starten: Ein zweites Makro starten? Das Makro soll sich selbst starten?

  • Do while not makrofertigfleg: WHILE FERTIG = FALSE oder so. Dass es ein Makro ist ergibt sich aus dem Kontext.

  • arbeite mit anderen Programmen: Nein, das Makro soll wohl kaum mit anderen Programmen arbeiten

  • LibreOffice in den Vordergrund bringen: Ich dachte es soll nicht in den Vordergrund, v.a. nicht, solange es nicht fertig ist.

  • set makrofertigflag if Abfrage sichtbar: Geht das so mit Rückwärts-Ifs in diesem Basic?

  • Loop: WEND ist auch nicht schlecht im Pseudocode

  • beantworte abfrage: Das ist die einzig halbwegs plausible Codezeile.

Ich dachte mir folgendes: Man macht ein Markierfeld (=Checkbox) in das Libreofficeprogramm, ob man gestört werden will. Das geht über Extras/anpassen/Menüs:

  • Kategorie Steuerelemente/Markierfeld

  • Ziel/Ansicht, zum Testen erstmal weit oben, 3. Punkt hinter Webvorschau, Umbenennen: mfMakro

Wenn man dann das Menü Ansicht öffnet ist da ein Punkt mfMakro (kann, wenn es funktioniert, einen besseren Namen bekommen).

Das schaltet man aus und startet das Makro.

Dann arbeitet man mit einem anderen Dokument oder legt sich schlafen oder führt die Katze aus.

Dein 1. Code sähe dann etwa so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Sub Main
Dim iAntwort As Integer
iAntwort = IDYES
Dim lWaitMilliseconds As Long
lWaitMilliseconds = 8000
While iAntwort = IDYES
    Wait lWaitMilliseconds
    IF private:resource/menubar/Ansicht/mfMakro.State = 1 Then
    	iAntwort = Msgbox("Wiederholen?", MB_YESNO, "Nochmal warten") 
    else
    	iAntwort = IDYES
    ENDIF
Wend
End Sub

Leider ist "private:resource/menubar/Ansicht/mfMakro.State = 1" falsch - so geht es nicht, aber ich denke in irgendeiner Weise müsste man das Mistding abfragen können.

Dein Subprozess, der da werkelt, soll ja die wohl die Millisekunden ersetzen und meldet sich 50 Mal am Tag. Aber 49x sagt er "Habe Step 17/50 erledigt" oder so und einmal "Step 50 erledigt. Fertig!" und nur die letzte Meldung soll aufpoppen. Oder fragst Du in fixen Zeitintervallen irgendwas ab, das sich schlecht abschätzen lässt?

Ohne nähere Infos kann man da dann keinen guten Testcode entwickeln. Wenn jmd. rausfindet, wie man irgendein Mehrfachfeld aus dem Menü abfragt, dann finden wir wohl auch raus, wie man so ein eigens geschaffenes abfragt. Wie man rausfindet, ob das Makro fertig ist, weiß ich nicht, aber eine weitere Bedingung zum if zuzufügen sollte gelingen, wenn man es weiß.

Antworten |