Wie bildet man ein RunOnce ab?

  • Guten Morgen,

    ich möchte gerne folgendes verwirklichen.

    Ein Script (EXE) bauen, die als Windows dienst läuft. Diese frägt mit AdlibRegister eine Funktion ab, welche nach der Existenz eines bestimmten Fenstern sucht. Sobald dieses Fenster existiert, soll eine weiteres Script (EXE) gestartet werden, welches genau einmal durchläuft und sich dann selbst beendet.

    Aktuell wird die aufgerufene EXE aber alle 250 ms neu gestartet, da ich bisher den Aufruf nur mit Run verwirklicht habe. Wie bilde ich hier den ein RunOnce ab?

    Kurze Erklärung was hier genau passieren soll.

    • Die 1. EXE läuft als Dienst uns schlummert im Hintergrund.
    • Wenn ich dann ein Telefonat reinbekomme, öffnet sich das Fenster, auf welches der Dienst wartet.
    • Wenn das Fenster entdeckt wird, soll die 2. EXE nur einmal starten. Diese positioniert 2 Fenster genau 1 mal an bestimmte Koordinaten. Danach beendet sich die 2. EXE
    • Problem ist jetzt, das die 1. EXE ja das zu suchende Fenster gleich wieder findet, jetzt aber die 2. EXE nicht mehr ausgeführt werden soll.

    Danke für Eure Hilfe

  • _Singleton

    _Singleton verhindert, dass ein Programm (hier 2.EXE) mehrmals gestartet wird.

    Wenn das Fenster entdeckt wird, soll die 2. EXE nur einmal starten. Diese positioniert 2 Fenster genau 1 mal an bestimmte Koordinaten. Danach beendet sich die 2. EXE

    Die 2.EXE ist nun also wieder geschlossen.

    Einen unerwünschten Neustart der 2.EXE würde _Singleton nicht verhindern, da ja keine Instanz von 2.EXE mehr läuft.

    Frage an Code4Fun : Was passiert, wenn das Telefonat beendet wird ?

    EDIT :

    Schließt Du dann die Fenster, die 2.EXE positioniert (und ggf. geöffnet hat - da 2 Fenster), oder bleiben sie für weitere Telefonate offen ?

    Problem ist jetzt, das die 1. EXE ja das zu suchende Fenster gleich wieder findet, jetzt aber die 2. EXE nicht mehr ausgeführt werden soll.

    Um das zu beantworten, müsste man den Ablauf genauer kennen.

    Du benötigst, neben der Existenz des Fensters, eine weitere abprüfbare Bedingung die verhindert, dass 2.EXE (unerwünscht) ausgeführt wird.

    Wie co_steffl bereist geschrieben hat, könntest Du einen 'Schalter' implementieren, z.B. :

    - eine kleine .ini-Datei -> [Key=Value] -> Start2EXE = True / False

    - eine Textdatei (wenn existiert NICHT starten - bei Bedarf löschen)

    - einen Registry-Eintrag -> ggf. problematisch wg. Zugriffsrechten (kein Admin)

    Sollte der Rechner z.B. 'abstürzen' steht der 'Schalter' aber ggf. falsch.

    Du könntest auch abfragen, ob die von 2.EXE verschobenen Fenster bereits an den neuen Positionen stehen, dann darf 2.EXE nicht erneut ausgeführt werden.

    Hier gibt es also reichlich Möglichkeiten :P.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (4. April 2019 um 16:23)

  • Danke für eure Hilfe. Der Tip mit den Countern war gut. Funktioniert jetzt super.

    ABER !!! Die 1. EXE läuft als Dienst noch nicht. Habe Sie folgendermaßen als Dienst unter Windows 10 - Version 1809 (Build 17763.379) eingerichtet.

    CMD als Administrator geöffnet und dann folgenden Befehl ausgeführt.

    Code
    sc create "AppStarter Monitor Service" start= auto binpath= "C:\Pfad zur Anwendung\AppStarterMonitorService.exe"

    Muss man sein Script irgendwie noch vorbereiten, damit es als Dienst läuft?

    Fehlermeldung ist: Der Dienst "AppStarter Monitor Service" auf "Lokaler Computer" konnte nicht gestartet werden. Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung

    Nachtrag: Ich habe es jetzt "temporär" via Windows Aufgabenplanung gelöst, d.h. sobald ich mich anmelde, wird die 1. EXE gestartet. Dienst wäre etwas schicker.

    Einmal editiert, zuletzt von Code4Fun (4. April 2019 um 11:36) aus folgendem Grund: Nachtrag erstellt

  • Nachtrag: Ich habe es jetzt "temporär" via Windows Aufgabenplanung gelöst, d.h. sobald ich mich anmelde, wird die 1. EXE gestartet. Dienst wäre etwas schicker.

    Nein wäre es nicht. Da der Dienst vermutlich in einem anderen Benutzerkontext laufen würde (local system?) kann dein Script sehr wahrscheinlich auch keine Fenster auf dem Desktop eines anderen angemeldeten Benutzers finden. Das Script im Kontext des entsprechenden Users auszuführen ist also in diesem Fall die beste / einzigste Lösung. Deine Konstruktion mit zwei Scripten ist eigentlich dann auch überflüssig, anstatt ein weiteres Script aufzurufen könnte dein Script die Fenster auch selbst verschieben und dann auch problemlos in Intervallen die Position prüfen bzw. wiederherstellen falls nötig.