[Gelöst] Wrapper-Programm / Fenster-Manager?

Antworten
petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

[Gelöst] Wrapper-Programm / Fenster-Manager?

Beitrag von petwey »

Hallo Forum,

ich suche nach einer Lösung um in einem Programm andere Programme einzubetten. Und zwar für Linux (und Windows).

a)Um klein anzufangen erstmal ein externes Programm starten und es z.B. auf Scrollbox darzustellen. D.h. das übergeordnete Programm bildet den Rahmen innerhalb dessen das fremde Programm dargestellt wird.

Ich habe bereits folgendes gefunden, dass allerdings nur unter Windows funktioniert, ich brauche es auch unter Linux:
https://www.delphipraxis.net/155278-ext ... ieren.html
Einen Ansatz wie in viewtopic.php?t=3256 könnte ich mir vorstellen, aber auch hier nur eine Windows-Variante

Hintergrund: Ich habe eine ganze Reihe von Programmen geschrieben, die sich über eine Script-Engine ansprechen lassen, aber spezialisierte Aufgaben erfüllen. Diese Programme sind über den Desktop verteilt und werden über Startparameter platziert. Ich möchte sie nun über ein weiteres Programm organisieren, damit ich mir den Aufruf über eine Batch-Datei, bzw. ein Shell-Script sparen kann.

Ich habe mir bereits das Docking angeschaut, aber keine Lösung gefunden wie man fremde oder eigenständige Programme aneinander andockt. Das wäre aber eine weitere Lösung für mein Problem.

Wenn möglich würde und könnte ich meine Programme um Funktionalität erweitern um zum Ziel zu kommen (wenn ich eine Lösung dafür hätte), aber meine Programme laufen auch noch zum Teil auf verschiedenen Rechnern, so dass ich sie per VNC anzeige. Und Ziel ist es auch den VNC-Viewer in dem "Wrapper" / "Fenster-Manager" einzubinden.

Momentan geht es mir nur um einen Ansatz für das in a) skizierte Problem unter Linux, der Rest ist Hintergrundinformatiom.

Wie lässt sich so etwas realisieren? Hab ich an den falschen Stellen gesucht?
Bitte um Hilfe.
Zuletzt geändert von petwey am Fr 21. Okt 2022, 19:46, insgesamt 1-mal geändert.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von marcov »


petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von petwey »

Hallo marcov,

Danke für deine Antwort.
Was macht dieses Programm? Mir fehlt ein wenig der Durchblick, vielleicht ist es auch schon zu spät.

Wenn ich es richtig sehe verwendest Du cmd.exe und eine testit.exe. Das passt nicht ganz zu der Anforderung das Problem vorrangig in Linux zu lösen.

Ich kann auch überhaupt nicht erkennen wie dieses Programm ein anderes Programm einbetten sollte.

Wie gesagt es ist auch schon recht spät.

Hat mein Problem etwas mit piping zu tun? Das ist komplettes Neuland für mich.


Jetzt ist mir aufgefallen warum mich dein Beispiel so irritiert hat und der Fehler liegt bei mir! Die zu öffnenden Programme sind GUI-Programme.

So wie ich es gelesen habe (unter Windows wohlgemerkt):
  1. Öffnen der Anwendung (z.B. mit TProcess)
  2. Handle auf die Anwendung herausfinden (???)
  3. Anwendung anhand des Handles die Anwendung füllend auf eine Komponente (z.B. TPanel) der übergeordneten Anwendung legen (???)
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von af0815 »

Nur um es zu definieren, du willst ein Programm mit grafischer Schnittstelle in dein Programm einbetten.

Die Beispiele beziehen sich normalerweise auf Programme ohne grafische Schnittstelle. Deswegen vielleicht auch die Verwirrung.

Windows und Linux haben einmal grundverschiedene Widgetsets, die sich um die grafische Oberfläche kümmern und auch Windows muss nicht homogen sein. Man kann auch auf Programme stoßen, die unter Windows gtk oder qt nutzen.
Deswegen wirst du Probleme haben, verschiedene Programme zusammen zu spannen, auch weil jeder Programm vom anderen Programm isoliert sein soll. Das ist mittlerweile anders als unter Win95.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von theo »

@petwey: Könnte schwierig werden.
Was mir da unter Linux/GTK als Beispiel spontan einfällt, ist das MPlayerControl.
https://wiki.freepascal.org/TMPlayerControl
Das ist aber natürlich noch keine beliebige Anwendung.

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von petwey »

Hallo af0815, hallo theo,

ist mir klar das das nicht einfach ist, aber ich kann noch ein paar Einschränkungen machen:
- Die Programme die ich einbetten will stammen von mir, damit bin ich in der Lage ihnen Schnittstellen / Funktionen mitzugeben, die mir die Aufgabe erleichtern, z.B. dass sie mir ihren Fenster-Handle (oder etwas adäqutes unter Linux) zur Verfügung stellen. Das könnte in einer einfachen Weise in eine Datei geschrieben werden aus der ich es dann auslese.
- Wenn ich das Windows-Beispiel richtig verstanden habe gehören die GUI-Fenster einem übergeordenten System (dem Fenster-Manager??). Und im Beispiel wird die Zugehörigkeit an ein Panel eines Programmes übergeben. Das müsste doch auch unter Linux möglich sein.

Ich führe das Beispiel hier nochmal an.
Der Link: https://www.delphipraxis.net/155278-ext ... ieren.html
Der Beispiel-Delphicode von Bummi:

Code: Alles auswählen

procedure TForm4.Button1Click(Sender: TObject);

var
  hNotepad: hWnd; //Handle auf das Window welches man einsperren möchte

begin
  hNotepad := FindWindow('notepad', nil); //In diesem Fall sperren wir das gute alte Notepad ein
  Windows.SetParent(hNotepad, panel1.Handle); //Wir setzen das Parent mit Windows.SetParent, da ein Aufruf
                                        //von SetParent zur Folge hätte, dass wir die Methode von
                                        //TWinControl aufrufen würden, was wir nicht wollen
  ShowWindow(hNotepad, SW_MAXIMIZE); //Einmal ShowWindow mit SW_MAXIMIZE als Parameter damit das Fenster
                                     //sich über die ganze Form erstreckt

end;
Leider sitze ich hier an einem Linux-PC und kann das unter Windows nicht so schnell testen.

Das Beispiel suggeriert, das das unter Windows geht. Ich kann mir nicht vorstellen, das Linux nicht ähnlich mächtig ist.

Braucht ihr noch weitere Informationen? Informationen zum Widgetset, etc. Bin da leider nicht so firm, bitte nennt mir den Weg um euch die Informationen zu geben.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von theo »

@petwey: Du kannst das versuchen, aber du wirst ziemlich alleine sein. Das hat auch nicht direkt mit Lazarus zu tun.

Auf Linux geht es wahrscheinlich um X11 Programmierung. Vielleicht teilweise auch um GTK/Qt, das weiss ich nicht so genau.
Falls es über X11/xlib lösbar ist, findest du hier die Doku: https://tronche.com/gui/x/xlib/
Auch: https://www.x.org/wiki/ProgrammingDocumentation/
Vielleicht hilft diese Funktion.
https://tronche.com/gui/x/xlib/window-a ... indow.html

Als Startpunkt für X11 Programmierung mit Lazarus könntest du meine Linux-Winlist anschauen:
https://www.theo.ch/lazarus/winlist2.zip
Das ist aber noch nicht das, was du suchst und hat auch noch Macken. Aber du kannst damit mal einschätzen, ob du in diese Welt eintauchen willst (siehe xwindowlist.pas).
Tüftlerarbeit, die dir niemand abnimmt. :wink:
Vielleicht geht es auch gar nicht.

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von petwey »

Hallo theo,

Danke für die Antwort.

Ich glaube XLib ist der richtige Ansatz. Bitte korrigiere mich falls ich hier falsch liege. Und meine Begriffe mögen nicht mit der üblichen XLib-Nomenklatur übereinstimmen.

- ? Ohne X geht unter Linux keine grafische Oberfläche. D.h. X ist die Basis auf der andere Widgetsets (QT, GTK) aufbauen. Damit ist XLib der richtige Ansatz um unabhägig vom Widgetset zu bleiben.
- ? Da X ein Server ist muss er laufen um grafische Oberflächen zu erstellen!
- ? Wenn ich XLib richtig verstanden habe verwaltet X die Fenster in Variablen "window". Wenn ich ein neues Window erzeuge kann ich sein zugehöriges Elternfenster ermitteln z.B. mit XRootWindow. Das sieht für mich wie eine baumartige Struktur aus, bei der man sich über Parent und Child durch die ganze Struktur hangeln kann. Damit könnte man sich theoretisch durch die gesamte Struktur arbeiten und - so hoff ich - z.B. so etwas wie "SucheNachFenster(TeildesFensterTitels)" bauen. Das wäre ein Teil der Aufgabe: Zugriff auf ein beliebiges Fenster bekommen.

Die unit xlib stellt übrigens eine Pascal-Portierung der C-Bibliothek dar. Ich weiss nicht ob sie vollständig ist. (Lazarus XLib -> https://wiki.freepascal.org/X11/de)

Bitte korrigiert mich wenn ich hier falsch liege.

Ich unterteile meine Aufgabe mal in Teilaufgaben:
- Gui-Anwendung öffnen -> kein Problem
- Suchen nach der GUI-Anwendung ala "SucheNachFenster(TeildesFensterTitels)" -> muss gebaut und getestet werden
- Mittels XReparentWindow das Eltern-Fenster wechseln -> sollte laut Beschreibung gehen, testen
- Gui-Fenster füllend in einer Koomponente wie TPanel oder besser TScrollBox darstellen -> hier weiß ich nicht ob das geht.

Wenn ich das alles so sehe sollten das - außer dem letzten Punkt - keine unüberwindlichen Teilaufgaben sein, die vielleicht auch schon in einem anderen Zusammenhang gelöst wurden. Vielleicht lassen sich auch andere Linux-Befehle wie wmctrl verwenden. Ich kenne hier nur wmctrl, für weitere Hinweise bin ich dankbar. Um neutral zu bleiben sollten diese Befehel auf XLib basieren, sonst kommen dann irgendwann Fehlermeldungen wie -> "kein QT", "kein GTK" oder ähnliches.
Gibt es hier Projekte oder Code-Schnipsel die XLib in diese Richtung verwenden?
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von wennerer »

Hallo petwey,
vorne weg, ich habe von der Thematik leider keine Ahnung. Jedoch habe ich vor einiger Zeit unter Linux Ubuntu 32Bit einen Hotkey erzeugt und musste mich dabei mit der XLib und XGrabKey herumschlagen. viewtopic.php?f=16&t=12099
Meine hauptsächliche Erkenntnisquelle fand ich hier: https://openbook.rheinwerk-verlag.de/li ... #Xxx999235. Eventuell findest du dort ja das was du suchst.

Viele Grüße
Bernd

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von charlytango »

hallo petway,

kann ja sein dass ich auf einem ganz falschen Dampfer sitze, aber möglicherweise hilft ja ein unbedarfter Blick auf das Problem.

--Die Programme die du zusammenfassen möchtest sind alle aus deiner Feder.

Was spricht dagegen mit einer Project Group alle Projekte zusammen zu fassen um sie auf einmal kompilieren zu können. (Sofern ich das auch noch von Delphi Zeiten her richtig verstanden habe).

Und dann mit einem Fenstermanager a la TDINotebook (über OPM installierbar) zusammenfassen -- jeder Tab ein eigenes Programmfenster.

Aber wie gesagt, ich kann auch völlig falsch liegen. Meine Idee klappt nur wenn die Programme nicht zwingend einzeln vorliegen müssen

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von theo »

petwey hat geschrieben:
So 14. Aug 2022, 18:09
Gibt es hier Projekte oder Code-Schnipsel die XLib in diese Richtung verwenden?
Wie oben gesagt: Als Start empfehle ich den Blick in die xwindowlist.pas.
Da steht schon einiges drin, was du brauchen wirst.
Hast du dir das schon angeschaut?

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von petwey »

Hallo theo,

Ich werde mir deinen winlist-code ansehen, laufen tut er schon einmal. Ich hab mich von deinen anderen Hinweisen ablenken lassen.

Hallo charlytango,

ProjektGroup und TDINotebook hört sich sehr interessant an, allerdings habe ich ein bißchen Angst davor wenn ich ein Teil-Projekt ändere, dass dann alles nicht geht und ich benötige nicht immer alle meine Programme. Ausserdem habe ich immer noch im Sinn auch Fremdprogramme mit einzubinden, denn Teile meiner Software laufen auf anderen Rechner und werden per TCP/IP gesteuert. Die Oberfläche dieser Rechner hole ich mir dann per VNC.

Hallo wernerer,

die deutsche Doku ist mir sehr wertvoll und auch deine Code-Schnipsel werde ich mir genauer ansehen.


Euch allen erstmal vielen Dank. Ich muss mir jetzt erstmal die vielen Infos sichten, testen usw. Das dauert ein bißchen. Wenn ich was greifbares habe werde ich es hier posten und Fragen werden bestimmt auch noch auftauchen.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von af0815 »

Bezüglich X Server. Einige Plattformen steigen auf Wayland um. Ich habe keine Ahnung wielange X11 und die Bibliotheken noch gehen. Nur falls du darauf stößt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Wrapper-Programm / Fenster-Manager?

Beitrag von theo »

af0815 hat geschrieben:
So 14. Aug 2022, 22:36
Bezüglich X Server. Einige Plattformen steigen auf Wayland um. Ich habe keine Ahnung wielange X11 und die Bibliotheken noch gehen. Nur falls du darauf stößt.
Ich glaube nicht, dass X11 so schnell verschwindet.
Mit Wayland hat petwey wahrscheinlich sowieso schlechte Karten bei seiner Idee, das ist afaik viel restriktiver bei solchen Sachen (Mit anderen Fenstern rumfummeln -> Sicherheit).

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: [GELÖST] Wrapper-Programm / Fenster-Manager?

Beitrag von petwey »

Hallo zusammen,

tut mir leid das es so lange gedauert hat, aber ich musste mich auch noch auf andere Dinge konzentrieren.

Nochmals Danke an alle und hier ganz besonders theo.

Mit Hilfe Eurer Ansätze konnte ich mir die notwendigen Werkzeuge zurechtlegen um mein Ziel umsetzen zu können.
Es ist mir nicht gelungen irgend eine Gui-Anwendung wie zum Beispiel den Galculator als Unterfenster in ein anderes Programm einzubetten, das vorab.
Ich musste also ein wenig umdenken. Aber dank theos code konnte ich auf eine Liste der vorhandenen Fenster zurückgreifen und über den Namen einzelne Fenster selektieren. Danach habe ich mit den verschiedensten Funktionen herumexperimentiert und wenn sie funktioniert haben in ein kleines Testprogramm eingebaut. Dazu zählen:
- Verschieben
- Minimieren
- Wieder normal darstellen
- Fensterdekoration entfernen
- Fenster nach vorne bringen
- Absolute Koordinaten ermitteln

Aus diesen Teilen konnte ich ein neues Konzept erarbeiten:
- Das Hauptprogramm ermittelt die Fensterliste.
- Ein selektiertes Fenster wird seiner Dekoration beraubt
- Es wird auf die 0,0 Koordinate eines Panels verschoben und seine Größe an die des Panels angepaßt.
- Es wird nach vorne gebracht.
- Beim Verschieben des Hauptfensters oder wenn die Größe des Panels sich ändert, werden die 3 vorangegangenen Punkte wiederholt.

Das ist noch ein wenig ungeschliffen, aber im Prinzip wird es funktionieren.

Hier mein Code:
wndwrapper..zip
(7.35 KiB) 71-mal heruntergeladen
Und hier ein Screenshot mit integriertem Galculaton:
Vorher:
Vorher.png
Vorher.png (203.73 KiB) 1936 mal betrachtet
Nachher:
Eingebettet.png
Eingebettet.png (31.07 KiB) 1936 mal betrachtet
Noch zur Info: Der Code wurde bisher nur auf einem 32-Bit Linux erstellt und getestet.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Antworten