ProcessClose geht nicht ganz

  • Meines Wissens kann man leider den aktuellen Pfad des Explorers nicht auslesen.

    folgendes Script stellt alle Ordner wieder her, in welchen im Title der Pfad steht...
    Funktioniert also nicht bei "Eigenen Dateien", "Arbeitsplatz" usw...

    [autoit]

    $Temp=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell")
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "AutoRestartShell", "REG_DWORD", 0)
    $aProcess=ProcessList("Explorer.exe")
    $aWindow=WinList()

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

    Global $aFolder[2]=[1,""],$iCnt=1
    For $i=1 To $aWindow[0][0]
    $hPid=WinGetProcess($aWindow[$i][1])
    For $j=1 To $aProcess[0][0]
    If $hPid=$aProcess[$j][1] And BitAND(WinGetState($aWindow[$i][1]),2) And StringInStr($aWindow[$i][0],":\") Then
    $iCnt+=1
    ReDim $aFolder[$iCnt+1]
    $aFolder[$iCnt]=$aWindow[$i][0]
    EndIf
    Next
    $aFolder[0]=$iCnt
    Next

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

    While ProcessExists("explorer.exe")
    ProcessClose("explorer.exe")
    WEnd

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

    For $i=1 To $aFolder[0]
    Run('explorer.exe ' & $aFolder[$i])
    Next

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

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

    [/autoit]

    lgE

    • Offizieller Beitrag

    Die Pfade von allen geöffneten Explorerfenstern?
    Doch, das geht:

    [autoit]


    $var = WinList()
    For $i = 1 To $var[0][0]
    ; Only display visible windows that have a title
    If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then
    $text = StringRegExpReplace($var[$i][0], '.*?\((.+)\)', '$1')
    $path = ControlGetText('[CLASS:CabinetWClass]', $text, 'Edit1')
    If $path <> "" Then MsgBox(0, "Details", "Title=" & $var[$i][0] & @LF & "Handle=" & $var[$i][1] & @LF & "Pfad=" & $path)
    EndIf
    Next

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

    Func IsVisible($handle)
    Return BitAND(WinGetState($handle), 2)
    EndFunc ;==>IsVisible

    [/autoit]
  • Ich hab XP.

    Hab aber grad was entdeckt:
    Es ist ein Unterschied, ob man den Explorer via Start-Rechtklick öffnet, oder mit Doppelklick auf einen Ordner.
    Jenachdem lautet die Class "ExploreWClass" oder "CabinetWClass" ;)

    Da find ich es dann doch einfacher den WindowTitle auszulesen...

    Aber bei z.B. "Eigene Dateien" steht da nur "Eigene Dateien" und nicht der Pfad. Sowohl im Edit1 wie auch im WindowTitle.

    lgE

  • So geht's auch, wenn es nur einen Explorer-Process gibt

    Spoiler anzeigen
    [autoit]

    $oShell = ObjCreate("shell.application")
    $oShellWindows = $oShell.windows
    $Process = ProcessList('explorer.exe')

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

    If IsObj($oShellWindows) Then
    $string = ""
    For $Window In $oShellWindows
    If WinGetProcess($Window.LocationName) = $Process[1][1] Then $string &= $Window.LocationName & @CRLF
    Next
    MsgBox(0, "Shell Windows", "You have the following shell windows:" & @CRLF & @CRLF & $string);
    EndIf

    [/autoit]
  • Nimm ShelleExecute(Window.LocationURL) ;)

    Spoiler anzeigen
    [autoit]

    $oShell = ObjCreate("shell.application")
    $oShellWindows = $oShell.windows
    $Process = ProcessList('explorer.exe')

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

    If IsObj($oShellWindows) Then
    $string = ""
    For $Window In $oShellWindows
    If WinGetProcess($Window.LocationName) = $Process[1][1] Then $string &= $Window.LocationURL & @CRLF
    Next
    MsgBox(0, "Shell Windows", "You have the following shell windows:" & @CRLF & @CRLF & $string & @CRLF & @CRLF & "open last window again");
    ShellExecute($Window.LocationURL)
    EndIf

    [/autoit]
  • Bei mir klappt es nicht ganz, er zeigt mir nur an, wenn ich Ordner öffne, die auf Laufwerk C liegen. Aber nicht, wenn ich Odner öffne die auf anderen Laufwerken liegen.


    Btw: Woher wisst ihr immer welche Objekte ihr nehmen müsst z.B. "shell.application" und welche Variablen z.B. "$oShell.windows" ihr nehmen müsst?

  • So klappt es bei mir super:

    Spoiler anzeigen
    [autoit]

    $oShell = ObjCreate("shell.application")
    $oShellWindows=$oShell.windows

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

    If Isobj($oShellWindows) Then
    $string=""

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

    For $Window In $oShellWindows
    $String = $String & $Window.LocationName & "/"
    Next

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

    MsgBox(0,"","Es gibt folgende geöffnete Fenster:" & @CRLF & $String)
    Else

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

    MsgBox(0,"","Es gibt keine geöffneten Fenster.")
    Endif

    [/autoit]

    Ist das eigentlich egal, wenn man die Variable $string mal groß und mal klein vorne schreibt?

    Einmal editiert, zuletzt von m-obi (5. Februar 2009 um 09:31)

  • Hi

    Bei mir klappt das nicht :(
    Es fehlen z.b. die Laufwerksbuchstaben...("Test" statt "D:\Test")

    Brauchbare Ergebnisse liefert bei mir jedoch

    [autoit]

    .LocationUrl

    [/autoit]


    Und JA, die Groß u Kleinschreibweise bei Variablen ist eigentlich egal.
    Aber je länger man programmiert, desto mehr achtet man (unbewusst) auf die gleiche Schreibweise ;)

    lgE

  • Er zeigt dir in meinem Fall nur die Fenstertitel an.

    Bei dir den ganzen Pfad mit .LocationUrl?

  • So sieht das Ergebnis bei mir aus:

    Window.LocationName:

    Code
    Eigene Dateien
    Test
    WINDOWS

    Window.LocationUrl:

    Code
    file:///C:/Dokumente und Einstellungen/GreyGoa/Eigene Dateien
    file:///D:/Test
    file:///C:/WINDOWS

    lgE

    EDIT: hab jetzt erst bemerkt, daß Progandy das mit LocationUrl schon geschrieben hat :D
    Sollte die Posts doch genauer lesen :whistling:

  • genauso ist es bei mir auch, nur er liest sogar Fenser vom Internet Explorer:

    Code
    Test
    Google
    Code
    file:///D:/Test
    http://www.google.de/
  • Wie kann ich sagen das er die Strings die "http://" enthalten, nicht nehmen soll?
    Oder kann ich ihn generell sagen, dass er die Strings vom Internet Explorer nicht nehmen soll?

    Spoiler anzeigen
    [autoit]

    Func _Window()
    $oShell = ObjCreate("shell.application")
    $oShellWindows=$oShell.windows

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

    If Isobj($oShellWindows) Then
    $StringName = ""
    $StringURL = ""
    For $Window In $oShellWindows
    $StringName = $StringName & $Window.LocationName & "\"
    $StringURL = $StringURL & $Window.LocationURL & "\"
    Next
    $StringName = StringTrimRight($StringName, 1)
    $StringURL = StringTrimRight($StringURL, 1)
    Return ($StringName & "|" & $StringURL)
    Else
    Return ""
    Endif
    EndFunc

    [/autoit]