Ich möchte einen Launcher für ein paar eigene Programm-Module schreiben. Die Programme können dabei von Hand, per verknüpfter Datei oder über den Launcher gestartet werden.
Beim Versuch, über den Launcher zu starten soll dieser schauen, ob das Programm schon läuft und dieses in den Vordergrund holen, ansonsten soll er es starten. Also ungefähr so wie bei LibreOffice.
Wie gehe ich da ran? Über die Programmnamen suchen? Die Programme haben recht eindeutige Namen, und sie laufen mit normalen Benutzerrechten.
Zielsystem: Windows, wenn möglich Linux mit GTK.
Schauen ob Programm gestartet und in Vordergrund holen
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Schauen ob Programm gestartet und in Vordergrund holen
Ich würde es so machen:
Starte mit dem Programm eine named pipe oder message queue (z.b. Lazarus’ simple ipc Server). Im launcher Versuch dann einfach diese zu öffnen (simpleipcclient), falls die pipe exsistiert schreib was rein, sonst starte das program
Im program checkst du dann wenn in die pipe was geschrieben wurde (also der serve was received hat) und falls das die Message des launches ist ruf bringtofront auf
So arbeiten auch Programme wie Firefox, wenn man auf einen Link klickt (das startet einfach die Firefox exec mit dem Link als Argument). Der neue Firefox Prozess checkt ob’s schon eine pipe gibt, wenn ja wird der Link in die pipe geschrieben und der alte Prozess öffnet diesen, während der neue Prozess dann einfach stirbt
Starte mit dem Programm eine named pipe oder message queue (z.b. Lazarus’ simple ipc Server). Im launcher Versuch dann einfach diese zu öffnen (simpleipcclient), falls die pipe exsistiert schreib was rein, sonst starte das program
Im program checkst du dann wenn in die pipe was geschrieben wurde (also der serve was received hat) und falls das die Message des launches ist ruf bringtofront auf
So arbeiten auch Programme wie Firefox, wenn man auf einen Link klickt (das startet einfach die Firefox exec mit dem Link als Argument). Der neue Firefox Prozess checkt ob’s schon eine pipe gibt, wenn ja wird der Link in die pipe geschrieben und der alte Prozess öffnet diesen, während der neue Prozess dann einfach stirbt
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Schauen ob Programm gestartet und in Vordergrund holen
Es gibt doch die Erweiterung RunOnce. Vielleicht findet man dort weitere Ansätze?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Schauen ob Programm gestartet und in Vordergrund holen
Man könnte hierfür die Komponente UniqueInstance von Luiz Américo Pereira Câmara (auch per Online-Package-Manager
installierbar) benutzen. Eigenschaft Enabled True setzen und im Ereignishandler "OnOtherInstance" ein FormXYZ.BringToFront
ausführen.
installierbar) benutzen. Eigenschaft Enabled True setzen und im Ereignishandler "OnOtherInstance" ein FormXYZ.BringToFront
ausführen.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2
-
- Beiträge: 1579
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Schauen ob Programm gestartet und in Vordergrund holen
Unter Windows geht es so:
Code: Alles auswählen
{$ifdef WINDOWS}
procedure TestMutex(sMutexText, sWindow: string);
var
h: HWND;
begin
mHandle := CreateMutex(nil, True, PChar(ansistring(sMutexText)));
if GetLastError = ERROR_ALREADY_EXISTS then
begin
if sWindow <> '' then // Anderes Fenster aktivieren
begin
h := FindWindow(nil, PChar(ansistring(sWindow)));
if h <> 0 then
begin
ShowWindow(h, SW_RESTORE);
SetForegroundWindow(h);
end;
end;
Halt;
end;
end;
{$endif}
EleLa - Elektronik Lagerverwaltung - www.elela.de
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Schauen ob Programm gestartet und in Vordergrund holen
Nachtrag:
Komponente UniqueIstance läuft bei mir unter Win7/10, sowie kubuntu18.10 und aktuellem Rasbian.
Gruß,
Michael
Komponente UniqueIstance läuft bei mir unter Win7/10, sowie kubuntu18.10 und aktuellem Rasbian.
Gruß,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2