Schauen ob Programm gestartet und in Vordergrund holen

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
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

Schauen ob Programm gestartet und in Vordergrund holen

Beitrag von Timm Thaler »

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.

Warf
Beiträge: 1908
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

Beitrag von Warf »

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

MacWomble
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

Beitrag von MacWomble »

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.

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Schauen ob Programm gestartet und in Vordergrund holen

Beitrag von Swirl »

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.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Schauen ob Programm gestartet und in Vordergrund holen

Beitrag von MmVisual »

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

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Schauen ob Programm gestartet und in Vordergrund holen

Beitrag von Swirl »

Nachtrag:
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

Antworten