Prozessüberwachung

  • Tag

    Ich arbeite grade an einem Script, bei welchem mit der Tastenkombination "Alt" + "." ein Programm beendet wird. Jedoch ist es ja auch möglich, das Programm selber zu beenden, also durch klicken auf das rote Kreuz oder durch die interne Funktion. Nun habe ich das Problem das, wen der User genau dies tut, also seine Anwendung selber schliesst, der Prozess von der AutoIt Anwendung weiterläuft, was ich allerdings unschön finde da beim erneuten Start, die Anwendung doppelt läuft. Hier erstmal der Code der entscheidende Abschnitt:

    [autoit]

    While 1
    sleep(100)
    WEnd

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

    Func _Close()
    WinKill("Fenstertitel")
    EndFunc

    [/autoit]


    Nun würde ich genau hier irgendwo noch eine Möglichkeit einbauen, dass er den Prozess der Anwendung überwacht, und sich selbst (also die AutoIt Anwendung) beendet, sobald er merkt dass die Anwendung nicht mehr läuft bzw. vom User durch die normale Funktion beendet wurde. Ich habe gewisse Sachen probiert, aber irgendwie bringe ich es nicht hin dass er sogesehen 2 While Sachen zum gleichen Zeitpunkt ablaufen lässt. Weiss wer Rat?

    Danke, Ahatius.

    Einmal editiert, zuletzt von ahatius (17. Januar 2009 um 21:50)

  • ProcessExists sollte dir weiterhelfen...

    EditH sagt:
    Ich packs nich warum is einer von euch immer ne Sekunde schneller?... Das is so deprimierend^^

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • @ Fire
    Mein Fehler, ich hätte erwähnen sollen dass ich es mit ProcessExists bereits versucht habe, aber irgendwie was falsch zu machen scheine.

    @ Oscar
    Wenn ich das richtig sehe, wird er erst mit der Tastenkombination merken dass der Prozess nicht mehr existiert, und somit einfach nur die Aktion das Fenster zu schliessen unterlassen. Ich will jedoch, dass er automatisch merkt, dass das Fenster bzw. der Prozess geschlossen wurde, und das Skript sich ohne weiteres (also ohne drücken der Tastenkombi) beendet. Ich werde es aber dennoch mal so probieren wie du es mir vorgeschlagen hast.

  • So in etwa hatte ich das bereits auch ausprobiert. Sobald er sieht, dass die Bedingung für die Schleife nicht mehr gültig ist, was macht er dann? Führt er die Funktion welche dann folgt einfach aus, oder wartet er auf das Drücken des Hotkeys?

    Edit: Ich hab das mal so gemacht wie du gesagt hast. Ergebnis: Das Script beendet sich mit dem Start der Anwendung (das Script startet, weiter vorne eben die Anwendung). Also ganz grob gesagt, wird der Hotkey gesetzt,die Anwendung gestartet, und dann auf das drücken des Hotkeys gewartet.

  • wenn da untendran nix mehr steht beendet sich das script... wenn du willst das es weiterläuft musst du untendran die nächste schleife reinbaun

    Und nein
    Func deinefunc()
    EndFunc

    Diese Funktion wird hier nur definiert, nicht ausgeführt... ausführen klappt nur mit

    deinefunc()

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Du sagst Schleife aber machst als Beispiel ne Funktion :\ Bin verwirrt.

    Ich finde ja, dass wen er sich sofort mit dem Start der Anwendung beendet, irgendwie nicht genug Zeit hat um zu erkennen dass der Prozess läuft, da ja in der Schleife steht dass sie laufen soll während der Prozess läuft, und nachher sich dann beendet (da ja nichts weiter kommt). Sehe ich das richtig?

  • Bsp 1.

    Spoiler anzeigen
    [autoit]

    ShellExecute("notepad.exe")

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

    HotKeySet('!.', '_Close')

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

    While ProcessExists("notepad.exe")
    sleep(100)
    WEnd

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

    MsgBox(0, "", "Notepad wurde beendet, aber dein Programm wird weiterhin ausgeführt")

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

    While 1
    WEnd

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

    Func _Close()
    ProcessClose("notepad.exe")
    EndFunc

    [/autoit]

    Bsp 2

    Spoiler anzeigen
    [autoit]

    ShellExecute("notepad.exe")

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

    HotKeySet('!.', '_Close')

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

    While ProcessExists("notepad.exe")
    sleep(100)
    WEnd

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

    MsgBox(0, "", "Notepad wurde beendet, das Programm wird nun auch beendet")

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

    ;und zwar weil hier keine weitere schleife mehr ist

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

    Func _Close()
    ProcessClose("notepad.exe")
    EndFunc

    [/autoit]

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Ich hab jetzt eine weitere Aufgabenstellung bekommen, bei der nachdem beenden des Scriptes ein Explorer Fenster aufgemacht werden muss (Netzlaufwerk Z:, oder wenn dieses nicht vorhanden ist, die lokalen Eigenen Dateien). Das klappt auch ganz gut, aber das mit dem überwachen des Prozesses wollte auch mit der 2. Schleife nicht klappen. Im Moment läuft das Skript so:

    [autoit]

    While ProcessExists("Prozess.exe")
    sleep(100)
    WEnd

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

    Func _Close()
    WinKill("Fenstertitel")
    If $Drive = "INVALID" then
    run("explorer.exe " & @MyDocumentsDir)
    Exit
    EndIf
    run("explorer.exe Z:")
    Exit
    EndFunc

    [/autoit]
  • Die habe ich wieder rausgenommen, da sie auf das gleiche Ergebnis rausführt. Abgesehen davon, hat mich die sowieso irgendwie verwirrt. Aber wenn ich ihm sage "While ProcessExists("Prozess.exe")", springt er sofort, selbst wenn "Prozess.exe" noch läuft, zum nächsten Schritt. Er ignoriert die Bedingung also.

  • und dein Prozess heisst sicher Prozess.exe???

    kann dann nur sein das du dich verschrieben hast... Denn das die Funktion nicht geht glaube ich nicht gibt nur 2 möglichkeiten

    1. Prozess existiert zu dem Zeitpunkt eben doch nicht (Lösung: Vor die While schleife mal ein Sleep setzen)
    2. du hast bei prozess.exe einen tippfehler oder sowas

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Sleep sei Dank!
    Aber ich bin jetzt doch ein wenig stutzig. Ich habe es, bevor ich hier einen Post eröffnet habe, eigentlich genau so probiert, mit einem Sleep vorher, weil mir das vorher bereits auffiel. Jedoch, beendete sich das Script dann nachher nicht. Habe ich anscheinend doch irgendein Detail vergessen. Jedenfalls Danke für Eure Hilfe ;)