Wie Fenster wieder öffnen?

2 Antworten

In Consolenanwendungen ist dies nicht ohne weiteres möglich, da diese "normalerweise" keinen Einfluss auf das FensterManagement haben. (in systemnahen Sprachen könnte man theoretisch einen Hook erstellen welcher in die "Mechanik" des Fensters eingreift)

Das ist mit Cmd/Batch nicht möglich. Ergo brauchen wir eine Instanz, welche auf unser Hauptfenster "aufpasst". Die einzige Möglichkeit ein Cmd-Fenster in Batch zu identifizieren ist dessen Titel als müssen wir unseren Fenstern Namen geben.

Die folgende Batch ist 2 Batchprogramme in einer Datei.

Beim normalen Start (per Mouseclick) wird kein Parameter übergeben. Die Batch startet sich selbst (:firstrun) minimiert mit dem Parameter watcher. damit weiß diese Instanz, das nur der Code von :watcher bis zum nächsten exit/b ausgeführt wird. (der macht nichts anderes als nachschauen ob das Hauptfenster geöffnet ist und ein paar sekunden zu warten) wird die Task mit dem Namen des Hauptfennsters nicht gefunden, wird die Batch erneut gestartet und dieser instanz per Parameter terminated mitgeteilt, dass der Watcher (Aufpasser) noch arbeitet und nicht erneut gestartet werden muss. Diese Instanz des Hauptfensters führt lediglich den Code nach :main aus.

das Hauptfenster fragt nach getaner Arbeit ob es regulär beendet werden soll. bei "J " bendet es den "Aufpasser" und zeigt zum Abschied noch eine Meldung...

Demo.cmd

@echo off
chcp 65001 >nul
 rem  diese beiden Settings sind nötig um die beiden Batchprozesse zu identifizieren (Du kannst auch Namen Deiner Wahl vergeben !!!keine  Sonderzeichen!!!) 
set "WatcherWindowName=Watcher"  &rem  Name  des Wächterfensters
set "MainWindowName=Runner"      &rem Name  des sichtbaren Hauptfensters


set  "detectionTime=1"  &rem  Zeit in Sekunden nach der  das Ireguläre  schließen des Fensters  erkannt werden soll

  rem teste wie die Batch gestartet wurde ohne Parameter=Normal, parameter=teminated unormal beendet ...
if "%~1"=="" goto :firstrun
if "%~1"=="terminated" (
    echo Das Hauptfenster wurde nicht durch regulär durch sich selbst beendet!
    goto :main
)

:watcher
 rem ...ansonsten  bleibt nur watcher= starte Wächter...
  rem Code für den Watcher
  rem setze den Fenstertitel für den Wächter
title %WatcherWindowName%
setlocal EnableDelayedExpansion
  rem Endlosschleife! Kein Problem da der Watchprozess später "gewaltsam" gekillt wird.
for /l %%a in (0) do (
    tasklist /nh /fi "Windowtitle eq %MainWindowName%"|find "cmd.exe" >nul||(
        echo !date! !time!  Das Fenster mit dem Namen "%MainWindowName%" wurde irregulär beendet ^^!  &rem einfach die  Schließzeiten ins  WatcherFenster loggen...  
        start "" cmd /c "%~f0" terminated  &rem wenn das Hauptfenster nicht existiert, starte es neu und und signalisiere den unnormalen restart
    )
    timeout %detectionTime% >nul
)
exit /b

:firstrun
 rem starte Überwachungsthread mit dem Fenstertitel Watcher minimiert (könnte man auch total unsichtbar machen, wäre für einen Anfänger jedoch zu komplex)
 rem wenn das Watcherfenster offen bleiben soll, entferne   den Parrameter /min  aus der nächsten Zeile  
start "" /min "%~f0" watcher


:main
 rem setze den Fenstertitel für das Hauptfenster
title %MainWindowName%
:mainLoop
 rem hier alles was normal  passeieren soll, solannge das Fenster nicht regulär  per Abfrage beendet  wird
echo Hallo Welt !
echo  ich mache  irgendwas!
echo:
echo:
 rem bis  hier
echo soll diese Batch normal  beendet werden. 
choice /m "entscheide Dich!"
if %errorlevel% equ 1 echo du hast mit Ja geantwortet! &goto :closeProgramm
if %errorlevel% equ 2 echo du hast mit Nein geantwortet!


goto :mainLoop
:closeProgramm
  rem wenn wir bis hier gekommen sind wurde das Fenster nicht durch den Nutzer beendet...
  rem nun beenden wir dem Überwachungsthread "gewaltsam"
taskkill /fi "Windowtitle eq %WatcherWindowName%" /f >nul
  rem zeigen dem Nutzer noch ein paar Sekunden eine Meldung und schließen  das Hauptfenste regulär.
echo Überwachungsthread beendet! Beende die Batch normal in:
timeout 5
exit /b
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Ich bin jetzt nicht am PC, aber ich hab den Code hier gefunden:

@echo off
:loop
start cmd /c ^"%~f0^"
goto loop

Kann auch eine Forkbomb sein, wie der Herr dort unten es so „nett“ erklärt hat. Wie gesagt, ich bin nicht am Pc.


Erzesel  28.06.2024, 16:05

😏na toll... Wenn Dir nichts besseres einfällt als eine ForkBomb....

!!! Nicht ausführen!!!

...sonst bleibt nur noch der Resetknopf!

Der Fragestelle möchte ein Fenster, welches sich zumindest nach dem scließen wieder automatisch öffnet. (das Schließen lässt sich mit Batch nicht verhindern)

Du gibst stattdessen ein Fenster , welches wiederholt neue Fenster öffnet welche ihrerseits immer neue Fenster öffnen. da diese Batches in Endlosschleifen laufen, nutzt das cmd /c herzlich wenig, da die Batches ja nie eigene Endstadien erreichen, welche das Fenster schließen könnten.

0