Fenster während Prozess schließen

  • Folgendes Problem:
    nach dem Start eines Programms, erscheint eine Fehlermeldung, welche mittels "WinWaitActive" und der entsprechende Taste übergangen werden soll.
    Das Programm muss aber mit RunWait gestartet werden, da ich nach dem Schließen des Programms erst zwei Dateien kopieren kann.

    [autoit]

    If Not FileExists("H:\spielstand\Schule2000total\Diktate2") Then DirCreate("H:\spielstand\Schule2000total\Diktate2")
    DirCopy("H:\spielstand\Schule2000total\Diktate2", "C:\Programme\BHV\WinLernenDiktate2.0", 1)

    [/autoit][autoit][/autoit][autoit]

    If WinWaitActive("WinLernen", "Zugriffsverletzung bei Adresse") Then Send("{SPACE}")
    Run("C:\Programme\BHV\WinLernenDiktate2.0\Diktat32.exe")

    [/autoit][autoit][/autoit][autoit]

    FileCopy("C:\Programme\BHV\WinLernen Diktate 2.0\RESULT.INI", "H:\spielstand\Schule2000total\Diktate 2.0", 1)
    Exit

    [/autoit]

    Jemand Vorschläge?

    Danke.

    Einmal editiert, zuletzt von WhatTheDuck (23. Juni 2008 um 13:35)

  • mach einfach ein 2tes Skript nur zum Schließen der Fehlermeldung in einer While-Schleife vllt mit einer zeitlichen Abbruchsbedingung. Dein 2tes Skript einfach aus dem ersten vor dem RunAndWait-Befehl starten

    oder so: AdlibEnable

  • AdlibEnable funktioniert soweit ganz gut, aber er pausiert dann das Script und beendet es nicht mehr.
    Ich weiß, dass es die Adlibdisable-Funktion gibt, jedoch funktioniert sie weder vor, noch nach dem RunWait-Befehl ... abgesehen davon, dass sie davor keinen Sinn macht.

  • Dann mach es doch mit AdLibEnable und
    If WinActive("WinLernen", "Zugriffsverletzung bei Adresse") Then Send("{SPACE}")
    Wenn das nich funktioniert, nimm stattdessen
    _Timer_SetTimer

  • @progandy - hier mal kurz, wie der Code jetzt aussieht:

    Spoiler anzeigen
    [autoit]

    ; Daten kopieren
    If Not FileExists("H:\spielstand\Schule2000total\Diktate2") Then DirCreate("H:\spielstand\Schule2000total\Diktate2")
    DirCopy("H:\spielstand\Schule2000total\Diktate2", "C:\Programme\BHV\WinLernenDiktate2", 1)
    ; Fehlermeldung umgehen
    AdlibEnable("myadlib")
    ; Programm starten
    RunWait("C:\Programme\BHV\WinLernenDiktate2\Diktat32.exe")
    ; Daten wieder zurückkopieren
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\RESULT.ini", "H:\spielstand\Schule2000total\Diktate2", 1)
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\Klasse.ini", "H:\spielstand\Schule2000total\Diktate2", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Func myadlib()
    If WinWaitActive("WinLernen", "Zugriffsverletzung bei Adresse") Then Send("{SPACE}")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]

    Wie setze ich _Timer_SetTimer ein und was bewirkt es? Habe es in der Function-List nicht gefunden.

    • Offizieller Beitrag

    Hallo,

    warum so kompliziert?

    [autoit]

    ; Daten kopieren
    If Not FileExists("H:\spielstand\Schule2000total\Diktate2") Then DirCreate("H:\spielstand\Schule2000total\Diktate2")
    DirCopy("H:\spielstand\Schule2000total\Diktate2", "C:\Programme\BHV\WinLernenDiktate2", 1)

    ; Programm starten
    $PID = Run("C:\Programme\BHV\WinLernenDiktate2\Diktat32.exe")

    [/autoit][autoit][/autoit][autoit]

    While ProcessExists($PID)
    If WinActive("WinLernen", "Zugriffsverletzung bei Adresse") Then Send("{SPACE}")
    Sleep(500)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    ; Daten wieder zurückkopieren
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\RESULT.ini", "H:\spielstand\Schule2000total\Diktate2", 1)
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\Klasse.ini", "H:\spielstand\Schule2000total\Diktate2", 1)

    [/autoit]
  • Die Frage selbst ist zwar schon eine Weile her, hatte jedoch jetzt erst wieder Zeit, mich damit zu beschäftigen.

    An sich funktioniert die Lösung von bernd, jedoch werden die Daten am Ende nicht kopiert, da das Script ja weiterläuft. Auch ein RunWait funktioniert nicht, da dann die While-Schleife nicht ausgeführt wird.

    Lösungen?

  • [autoit]

    While ProcessExists($PID)
    If WinActive("WinLernen", "Zugriffsverletzung bei Adresse") Then
    Send("{SPACE}")
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\RESULT.ini", "H:\spielstand\Schule2000total\Diktate2", 1)
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\Klasse.ini", "H:\spielstand\Schule2000total\Diktate2", 1)
    Endif
    Sleep(20)
    WEnd
    Exit

    [/autoit]

    Kleinere Sleep-Zeiten sind afaik weniger CPU-lastig.

  • Hallo Taek,

    Deine Lösung führt den Kopiervorgang nur dann aus, wenn das Fenster auch erscheint, dann jedoch sofort. Bedeutet also, dass er es leider wieder nach dem Programm macht. Danke für den Ansatz.

  • Achso, das Fenster soll also erst angezeigt werden, nachdem die Fehlermeldung weggeklickt wurde?

    Spoiler anzeigen
    [autoit]

    ; Daten kopieren
    If Not FileExists("H:\spielstand\Schule2000total\Diktate2") Then DirCreate("H:\spielstand\Schule2000total\Diktate2")
    DirCopy("H:\spielstand\Schule2000total\Diktate2", "C:\Programme\BHV\WinLernenDiktate2", 1)

    ; Programm starten
    $PID = Run("C:\Programme\BHV\WinLernenDiktate2\Diktat32.exe","",@SW_HIDE)
    Winwait("WinLernen", "Zugriffsverletzung bei Adresse")
    Send("{SPACE}"
    WinSetState("WinLernen","",@SW_SHOW)
    While ProcessExists($PID)
    Sleep(1000)
    WEnd
    Sleep(1000); zur Sicherheit, falls noch irgendwelche Dateien "belegt" sind
    ; Daten wieder zurückkopieren
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\RESULT.ini", "H:\spielstand\Schule2000total\Diktate2", 1)
    FileCopy("C:\Programme\BHV\WinLernenDiktate2\Klasse.ini", "H:\spielstand\Schule2000total\Diktate2", 1)

    [/autoit]
  • Juchu - habe es endlich hinbekommen:

    Spoiler anzeigen
    [autoit]

    ; Daten -falls vorhanden- kopieren
    If FileExists("H:\spielstand\Cornelsen\Zeitgenoessische Literatur 1") Then
    FileMove("H:\spielstand\Cornelsen\Zeitgenoessische Literatur 1", "C:\CSOFT\ZGL-CD1" & @UserName, 1)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Programm starten
    $PID = Run("V:\CSoft-FWU\ZGL-CD1\start.EXE")

    [/autoit] [autoit][/autoit] [autoit]

    ; Ok drücken, falls es auftaucht
    While ProcessExists($PID)
    If WinActive("Zeitgenössische Literatur", "Benutzerverzeichnis anlegen") Then Send("!o")
    Sleep(500)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; Sleep, da nicht sicher ist, wann der Prozess genau startet
    Sleep(1000)

    [/autoit] [autoit][/autoit] [autoit]

    ; Programm erst fortführen, wenn zgl.exe beendet wurde
    While ProcessExists("zgl.exe")
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; ein Sleep, falls noch irgendwelche Dinge verarbeitet werden müssen
    Sleep(1000)

    [/autoit] [autoit][/autoit] [autoit]

    ; nach dem Programm-Ende die Daten wieder zurückkopieren und Ordner auf C: löschen
    FileMove("C:\CSOFT\ZGL-CD1\" & @UserName, "H:\spielstand\Cornelsen\Zeitgenoessische Literatur 1", 1)

    [/autoit]

    Falls sich jemand wundert: anderes Programm, aber selbes Problem ;)

    Danke, an alle die geholfen haben.

  • Kleiner Nachtrag:

    Beim FileMove-Befehl muss natürlich 9 als Flag gesetzt sein, damit der Ordner -falls notwendig- neu erstellt wird.