Schauen ob Programm gestartet und in Vordergrund holen

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1032
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: 1414
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

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: 974
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
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: 51
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: win mac linux / jeweils aktuell
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte

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.
Arbeite mit Lazarus 2.0.8 - FPC 3.0.4 auf Win/Linux
Spiele mit Lazarus auf macOS 10.14 (Mojave)

MmVisual
Beiträge: 1118
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
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}

Benutzeravatar
Swirl
Beiträge: 51
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: win mac linux / jeweils aktuell
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte

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
Arbeite mit Lazarus 2.0.8 - FPC 3.0.4 auf Win/Linux
Spiele mit Lazarus auf macOS 10.14 (Mojave)

Antworten