Alle Fenster schliessen

  • Hallo

    Ich brauche eure Hilfe. :)
    Ich möchte ein Script erstellen, welches alle gestarteten Programme schliesst (sofern nichts gespeichert werden muss).
    Falls alle Programme geschlossen werden konnten, soll der Computer herunterfahren.
    Ich habe das Ganze mit WinClose versucht, weiss jedoch nicht, wie ich machen kann, dass alle Fenster geschlossen werden-.-

    Danke für eure Hilfe.

    Gruss chnooorzi

    Einmal editiert, zuletzt von chnooorzi (23. April 2010 um 08:28)

  • Naja, du musst alle Fenster ermitteln und danach schließen.

    Ermitteln würde mit der Funktion aus der Hilfe gehen :) :

    Spoiler anzeigen
    [autoit]


    $var = WinList()

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

    For $i = 1 to $var[0][0]
    ; Listet nur die sichtbaren Fenster auf, die einen Titel haben
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    MsgBox(0, "Details", "Titel=" & $var[$i][0] & @LF & "Handle=" & $var[$i][1])
    EndIf
    Next

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

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf

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

    EndFunc

    [/autoit]

    Und dann mit WinClose die Fenster schließen.

  • Danke! :)
    Ich möchte nun, dass sobald ein Fenster nicht ohne Nachfrage geschlossen werden kann, das Script beendet wird.
    Dazu habe ich das folgende eingefügt.

    If winclose($var[$i][1]) = 0 Then
    MsgBox(0, "Details", "nicht geschlossen")
    Else
    MsgBox(0, "Details", "Geschlossen")

    Leider kommt immer die MsgBox "Geschlossen" egal ob das Fenster geschlossen wurde oder nicht.
    Habt ihr mir hierfür einen Tipp ? =)

  • nimm sowas:


    [autoit]


    if msgbox(4, "Fenster schließen?", "Soll das fenster " & $var[$i][1] & " geschlossen werden?") = 6 then
    winclose($var[$i][1])
    ;else kann man weglassen
    ;msgbox(0,"", "Nicht geschlossen")
    endif

    [/autoit]
  • Du kannst auch Winclose machen, ne Sekunde warten, und dann mit WinExists gucken, ob das Fenster noch offen ist (z.B. "Sie haben ungespeicherte Änderungen. Speichern?"). Wenn ja, dann beenden.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Na das ist ja keine sonderlich elegante Lösung, oder?

    Ich hab mich mal an dem ganzen per PostMessage versucht. Leider bekomme ich immer 1 zurück, egal ob ich es über WM_SYSCOMMAND oder WM_QUERYENDSESSION mache. :S

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    Global Const $WM_QUERYENDSESSION = 0x11
    Global Const $ENDSESSION_CLOSEAPP = 0x00000001

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

    $aWinList = WinList()
    For $i = 1 To $aWinList[0][0]
    If BitAND(WinGetState($aWinList[$i][1]), 2) Then
    If MsgBox(4, $aWinList[$i][0], "schließen?") = 6 Then
    ;~ $aRet = _WinAPI_PostMessage($aWinList[$i][1], $WM_QUERYENDSESSION, $ENDSESSION_CLOSEAPP, 0)
    $aRet = _WinAPI_PostMessage($aWinList[$i][1], $WM_SYSCOMMAND, $SC_CLOSE, 0)
    ConsoleWrite("ret: " & $aRet & @TAB & "ext: " & @extended & @TAB & "error: " & @error & @CRLF)
    EndIf
    EndIf
    Next

    [/autoit]
  • Hi
    Habs nun so gemacht

    Spoiler anzeigen


    Ist zwar auch nicht sehr elegant, erfüllt aber seinen Zweck=)
    Thx für die Hilfe

    Gruss Chnooorzi