ProcessClose geht nicht ganz

  • Guten Morgen,

    ich habe ein Problem mit dem ProcessClose, wenn ich mein Script ausführe, schließt er zwar den Prozess, aber dann starte danach der Prozess wieder, was er eigentlich nicht soll.

    [autoit]

    ProcessClose("explorer.exe")

    [/autoit]

    Das ist mein ganzer Code!

    • Offizieller Beitrag

    Ist doch auch richtig das die Explorer.exe wieder gestartet wird. Oder willst du Windows ohne eine Tray oder ein Startmenü?

  • Ne ich will selber die explorer.exe starten. Das geht wenn man es manuell macht schon. Im Task-Manager Prozess beenden und dann neue Task, da macht es Windows nicht selber.

    • Offizieller Beitrag

    Die Explorer.exe wird sich immer wieder starten wen du das mit Autoit machst . Autoit ist nicht der Taskmanager .

  • Ich will ja mit AutoIT den Prozess schließen und dann nach wenigen Sekunden selber wieder starten. Aber das geht nicht, weil Windows, selber den Prozess wider startet, nach dem ich den geschlossen habe.

  • öhhm... dann musst du ihn halt ständig schliessen oder win daran hindern diesen wieder zu starten...

    mal ganz nebenbei: wofür willst du den explorer.exe prozess killen???

    MFG FireFlyer

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

  • Ne wenn mein Rechner mal wider langsam läuft oder ich hab öfters dass die taskleiste durcheinander ist, dann hilft es explorer.exe neuzustarten.

    Aber ich habs gefunden, wie man Windows daran hindern kann:

    [autoit]

    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell", "REG_DWORD", 0)

    [/autoit]
  • Mein Code funktioniert soweit.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    Global $alabel[3]

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

    $PID = ProcessExists("explorer.exe")

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

    $gui = GUICreate("", 500, 110, -1, -1, BitOR($WS_BORDER, $WS_POPUP), $WS_EX_TOPMOST)
    $alabel[0] = GUICtrlCreateLabel("Bitte warten ...", 0, 10, 500, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont ($alabel[0], 14)
    $alabel[1] = GUICtrlCreateLabel('Prozess "explorer.exe" wird neugestartet!', 0, 40, 500, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont ($alabel[1], 12)
    $alabel[2] = GUICtrlCreateLabel('', 0, 70, 500, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont ($alabel[2], 12)
    GUISetState(@SW_HIDE, $gui)

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

    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell", "REG_DWORD", 0)

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

    If $PID Then
    GUISetState(@SW_SHOW, $gui)
    BlockInput(1)
    GUICtrlSetData($alabel[2],"Tastatur und Maus sind gesperrt.")
    ProcessClose($PID)
    EndIf

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

    If ProcessWaitClose($PID) Then
    Sleep(1000)
    Run("explorer.exe")
    $PID = ProcessExists("explorer.exe")
    EndIf

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

    If ProcessWait($PID) Then
    For $i = 13 To 1 Step -1
    If $i >= 11 Then
    GUICtrlSetData($alabel[2],"Tastatur und Maus sind gesperrt.")
    Else
    GUICtrlSetData($alabel[2],"Tastatur und Maus sind wieder freigeschalten in " & $i & " Sekunde(n).")
    EndIf
    Sleep(1000)
    Next
    ;~ Sleep(15000)
    GUISetState(@SW_HIDE, $gui)
    ;~ MsgBox(0, "Info", $PID)
    EndIf

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

    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell", "REG_DWORD", 1)
    BlockInput(0)

    [/autoit]

    Nur es müssen vorher alle Ordner geschlossen werden.

    Gibts irgendwie einen befehl wo man nur Ordner schließt?

  • Danach war ich auch auf der Suche,vielen Dank für die Lösung.
    Fenster schließen wiefolgt:

    Spoiler anzeigen
    [autoit]

    Func closewindows()
    $var = WinList()

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

    For $i = 1 to $var[0][0]
    ; Only display visble windows that have a title
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    WinClose($var[$i][0])
    ;MsgBox(0, "Details", "Title=" & $var[$i][0] & @LF & "Handle=" & $var[$i][1])
    EndIf
    Next

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

    EndFunc

    [/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]
    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Ich helfe gerne, aber deine Hilfe hab ich auch schon gefunden in der Hilfe von AutoIT. Ich möchte aber nur Windows Ordner schliessen, keine anderen Programme. Weil, wenn ich z.B. eine Ordner mit Bildern oder Musikdateien offen habe und ich führe meine Script aus, beendet er zwar Explorer.exe zuerst, aber er startet sie dann nicht neu, sondern öffnet einfach Eigene Dateien und Taskleiste macht er nicht neu. Wenn ich aber alle Ordner vorher schliesse, dann öffnet er nicht Eigene Dateien sondern startet, wie er es soll, die normale exlorer.exe und startet die Taskleiste neu. Öffne mal einen Ordner und gucke in dem Task-Manager unter Prozesse, dann siehste das zwei explorer.exe gestartet wurden. Wenn du keinen Ordner offen hast, dann ist dort nur eine .exe, aber wenn du 1 oder 2 oder 3 Ordner offen hast, dann ist da noch eine explorer.exe aufgelistet.

  • Du meinst Standardeinstellung? Kann man das umstellen? Jedenfalls macht mein Windows das was ich beschrieben habe.

    Edit: Hab gefunden wo man das ändern kann. In Ordneroptionen die Option "Ordnerfenster in einem eigenen Prozess starten" anhacken, dann kommt immer die zweite explorer.exe.

    Einmal editiert, zuletzt von m-obi (3. Februar 2009 um 23:48)

  • Hab jetzt gefunden wie man das Problem lösen kann, aber es werden dann vorher alle geöffneten Ordner geschlossen. Er prüft einfach ob zwei explorer.exe gestartet wurden.

    hier:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    Global $alabel[3], $PID[2]

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

    $PID[0] = ProcessExists("explorer.exe")

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

    $gui = GUICreate("", 500, 110, -1, -1, BitOR($WS_BORDER, $WS_POPUP), $WS_EX_TOPMOST)
    $alabel[0] = GUICtrlCreateLabel("Bitte warten ...", 0, 10, 500, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont ($alabel[0], 14)
    $alabel[1] = GUICtrlCreateLabel('Prozess "explorer.exe" wird neugestartet!', 0, 40, 500, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont ($alabel[1], 12)
    $alabel[2] = GUICtrlCreateLabel('', 0, 70, 500, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont ($alabel[2], 12)
    GUISetState(@SW_HIDE, $gui)

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

    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell", "REG_DWORD", 0)

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

    If $PID[0] Then
    MsgBox(64, "Hinweis", "Es werden alle geöffneten Ordner geschlossen!")
    Sleep(500)
    GUISetState(@SW_SHOW, $gui)
    BlockInput(1)
    GUICtrlSetData($alabel[2],"Tastatur und Maus sind gesperrt.")
    ProcessClose($PID[0])
    Sleep(500)
    $PID[1] = ProcessExists("explorer.exe")
    If $PID[1] Then
    ProcessClose($PID[1])
    EndIf
    EndIf

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

    If ProcessWaitClose($PID[0]) Or ProcessWaitClose($PID[1]) Then
    Sleep(1000)
    Run("explorer.exe")
    $PID[0] = ProcessExists("explorer.exe")
    EndIf

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

    If ProcessWait($PID[0]) Then
    For $i = 15 To 1 Step -1
    If $i >= 11 Then
    GUICtrlSetData($alabel[2],"Tastatur und Maus sind gesperrt.")
    Else
    GUICtrlSetData($alabel[2],"Tastatur und Maus sind wieder freigegeben in " & $i & " Sekunde(n).")
    EndIf
    Sleep(1000)
    Next
    GUISetState(@SW_HIDE, $gui)
    EndIf

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

    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell", "REG_DWORD", 1)
    BlockInput(0)

    [/autoit]