Versteckte Dateien aktualisieren

  • AutoIt3 Version: 3.2.11.1 (Beta)
    Betriebssystem: Windows XP 32Bit incl. SP2


    Ich habe ein Programm geschrieben, dass später über Hotkeys (in dem Skript nicht eingebunden und auch nicht nötig)
    ausgeführt wird.
    Es aktiviert oder deaktiviert die Ordneroption "Versteckte Dateien anzeigen" (Ist ja mal egal, wie es wirklich heist).

    Ich habe das ganze über die Registry gelöst, weil mir das als der beste Weg erscheint und ich nicht alles über "ControlSend"
    Schritt für Schritt eingeben muss.
    Funktioniert auch alles wunderbar nur kann ich nicht wie bei dem "OrdnerOption" Fenster die Einstellungen übernehmen, sodas
    alle offenen Explorer Fenster aktualisiert werden und sofort oder überhaupt die versteckten Ordner anzeigt bzw. ausblendet werden.

    Eine Lösungsidee war alle existierenden Ordner zu suchen und über "ControlSend" mit "F5" oder "BROWSER_REFRESH" zu aktualisieren.
    - Alle Windows-Explorer Fenster kann ich selektieren("Func _listWin()").
    - Aktualisieren bekomme ich nicht hin.(Wenn ich selbst "F5" drücke funktioniert die Aktualisierung manchmal, aber da scheint es
    keine Regel zu geben).

    Beispiel für ControlSend: ControlSend($h_Win, "SysListView32", "", "{F5}")

    Eine andere Lösung wäre, sich alle existierende Fensterpfade, Zustand(Position, Minimize usw.) zu merken; die Fenster zu löschen
    und mit den selben Eigenschaften bzw. Verhalten repuplizieren.
    Halte ich auch nicht für sinnvoll, da man sich, wenn ,man gerade am Arbeiten ist doch noch mal neu Orientieren müsste.


    Meine Frage ist, gibt es einen eleganten Weg diese Aktualisierung auszuführen, oder bleibt mir nur der Weg über die Ordneroptionen
    selbst, was meine Registry Funktion allerdings sinnlos macht?

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Process.au3>
    #include <Misc.au3>
    #Include <WinAPI.au3>
    ;
    AutoItSetOption("WinTitleMatchMode", 4)
    Opt("MustDeclareVars", 1)
    ;
    ;
    ;===============================================================================
    ; Start Program
    ;===============================================================================
    _main()
    ;
    ;
    ;===============================================================================
    ; Functions
    ;===============================================================================
    Func _main()
    _changeFileVisible()
    If @error Then Exit
    _listWin()
    EndFunc ;==>_main
    ;
    ;===============================================================================
    ; Function Name: _listWin
    ; Description: Listet alle offenen Fenster auf und selektiert die "WindowS-Explorer" Fenster in ein Array.
    ; Der erste Wert im Array ist auch gleichzeitig das "Aktive".
    ; Parameter(s):
    ;
    ;
    ; Syntax: _listWin()
    ; Return Value(s): On Success - Gibt ein Array zurück mit allen existierenden "Windows-Explorer" Fenstern
    ; deren Handle und Status
    ; $av_ExplorerWinList["Fenstertitel"]["Handle"]["Status"]
    ; On Failure -
    ;
    ; Author(s): Patric Pendelin <[email='patricpendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _listWin()
    Local $ah_WinList = WinList()
    Local $av_ExplorerWinList[$ah_WinList[0][0]][3]
    Local $s_winState
    Local $s_winStatus
    Local $f_Class
    ;
    For $i = 0 To $ah_WinList[0][0] Step 1
    If $ah_WinList[$i][0] <> "" And IsVisible($ah_WinList[$i][1]) Then
    $f_Class = _isClass($ah_WinList[$i][0], "ExploreWClass")
    If $f_Class Then
    $av_ExplorerWinList[0][0] += 1
    $av_ExplorerWinList[$i][0] = $ah_WinList[$i][0]
    $av_ExplorerWinList[$i][1] = $ah_WinList[$i][1]
    $s_winState = WinGetState($ah_WinList[$i][1], "")
    ;
    If $s_winState = 7 Then
    $s_winStatus = "@SW_RESTORE"
    ElseIf $s_winState = 23 Then
    $s_winStatus = "@SW_MINIMIZE"
    ElseIf $s_winState = 39 Or $s_winState = 35 Then
    $s_winStatus = "@SW_MAXIMIZE"
    Else
    $s_winStatus = ""
    EndIf
    $av_ExplorerWinList[$i][2] = $s_winStatus
    EndIf
    EndIf
    Next
    $ah_WinList = ""; leert das Array
    _Array2DEmptyDel($av_ExplorerWinList, 0); löscht alle lehren Spalten
    ;
    ;~ _ArrayDisplay($av_ExplorerWinList, "_listWin")
    ;
    Return $av_ExplorerWinList
    EndFunc ;==>_listWin
    ;
    ;===============================================================================
    ; Function Name: _changeFileVisible
    ; Description:
    ;
    ; Parameter(s): Prüft, sdie Registry, wie der aktuelle Zustand der Versteckten Dateien ist
    ; und ändert den Wert dementsprechend
    ;
    ;
    ; Syntax: _changeFileVisible()
    ; Return Value(s): On Success - Return 1
    ; On Failure - Return 0
    ;
    ; Author(s): Patric Pendelin <[email='patricpendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _changeFileVisible()
    Local $i_State
    ;
    $i_State = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden")
    If $i_State = 1 Then
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden", "REG_DWORD", "2")
    If Not @error Then Return 1
    ElseIf $i_State = 2 Then
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden", "REG_DWORD", "1")
    If Not @error Then Return 1
    EndIf
    If @error Then Return 0
    EndFunc ;==>_changeFileVisible
    ;
    ;===============================================================================
    ; Function Name: _isClass
    ; Description:
    ;
    ; Parameter(s): Prüft, ob es sich um die jeweilige Klasse handelt.
    ;
    ;
    ; Syntax: _isClass($s_WindowTitel, $s_Class)
    ; Return Value(s): On Success - Return 1
    ; On Failure - Return 0
    ;
    ; Author(s): Patric Pendelin <[email='patricpendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _isClass($s_WindowTitel, $s_Class)
    Local $s_ClassName
    Local $h_Handle
    ;
    $s_ClassName = "classname=" & $s_Class
    $h_Handle = WinGetHandle($s_ClassName, $s_WindowTitel)
    If @error Then
    SetError(1)
    Return 0
    Else
    Return 1
    EndIf
    EndFunc ;==>_isClass
    ;
    ;===============================================================================
    ; Function Name: IsVisible
    ; Description:
    ;
    ; Parameter(s):
    ;
    ;
    ; Syntax: IsVisible($h_Handle)
    ; Return Value(s): On Success - Return 1
    ; On Failure - Return 0
    ;
    ; Author(s): AutoIt3 Help
    ;===============================================================================
    Func IsVisible($h_Handle)
    If BitAND(WinGetState($h_Handle), 2) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc ;==>IsVisible
    ;
    ;
    ;----------------------------------------------------------------------------------------------------------------------
    ; UDFs
    ;----------------------------------------------------------------------------------------------------------------------
    ;
    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _Array2DEmptyDel(ByRef $avArray [, $Col=0])
    ;
    ; Description Delete empty Array elements
    ; Delete all emty Rows or all empty Columns
    ; Works also with 1D-Array (only Rows)
    ;
    ; Parameter $avArray Given Array
    ; optional $Col set 1 to delete empty Columns; default is 0 to delete empty Rows
    ;
    ; Return Succes -1 ByRef the given Array without empty Elements, resized
    ; Failure 0 and set @error = 1
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DEmptyDel(ByRef $avArray, $Col = 0)
    If (Not IsArray($avArray)) Then
    SetError(1)
    Return 0
    EndIf
    Local $UBound2nd = UBound($avArray, 2)
    If @error = 2 Then
    Local $arTMP[1]
    For $i = 0 To UBound($avArray) - 1
    If StringLen($avArray[$i] > 0) Then
    If StringLen($arTMP[UBound($arTMP) - 1]) = 0 Then
    $arTMP[UBound($arTMP) - 1] = $avArray[$i]
    Else
    ReDim $arTMP[UBound($arTMP) + 1]
    $arTMP[UBound($arTMP) - 1] = $avArray[$i]
    EndIf
    EndIf
    Next
    Else
    If $Col = 0 Then
    Local $arTMP[1][$UBound2nd], $val, $len
    For $i = 0 To UBound($avArray) - 1
    $val = ''
    For $k = 0 To $UBound2nd - 1
    $val &= $avArray[$i][$k]
    Next
    If StringLen($val) > 0 Then
    $len = 0
    For $k = 0 To UBound($arTMP, 2) - 1
    $len &= StringLen($arTMP[UBound($arTMP) - 1][$k])
    Next
    If $len = 0 Then
    For $k = 0 To $UBound2nd - 1
    $arTMP[UBound($arTMP) - 1][$k] = $avArray[$i][$k]
    Next
    Else
    ReDim $arTMP[UBound($arTMP) + 1][$UBound2nd]
    For $k = 0 To $UBound2nd - 1
    $arTMP[UBound($arTMP) - 1][$k] = $avArray[$i][$k]
    Next
    EndIf
    EndIf
    Next
    Else
    Local $arTMP[UBound($avArray)][1], $val, $len
    For $k = 0 To $UBound2nd - 1
    $val = ''
    Local $notEmpty = 0
    For $i = 0 To UBound($avArray) - 1
    $val &= $avArray[$i][$k]
    If StringLen($val) > 0 Then
    $notEmpty = 1
    ExitLoop
    EndIf
    Next
    If $notEmpty = 1 Then
    $len = 0
    For $i = 0 To UBound($arTMP) - 1
    $len &= StringLen($arTMP[$i][UBound($arTMP, 2) - 1])
    Next
    If $len = 0 Then
    For $i = 0 To UBound($avArray) - 1
    $arTMP[$i][0] = $avArray[$i][$k]
    Next
    Else
    ReDim $arTMP[UBound($avArray)][UBound($arTMP, 2) + 1]
    For $i = 0 To UBound($avArray) - 1
    $arTMP[$i][UBound($arTMP, 2) - 1] = $avArray[$i][$k]
    Next
    EndIf
    EndIf
    Next
    EndIf
    EndIf
    $avArray = $arTMP
    Return -1
    EndFunc ;==>_Array2DEmptyDel

    [/autoit]


    Hier mal die Datei: _pix_scan.au3

    • Offizieller Beitrag

    Hallo

    Man hat ja sonst nix zu tun :D

    Spoiler anzeigen
    [autoit]

    #include <ie.au3>
    Global $hDll = DllOpen('User32.dll');am anfang des Scriptes setzen
    _RefreshExplorer()

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

    ;by GtaSpider
    Func _RefreshExplorer()
    Local $aWl, $sClass, $i,$hEnable = WinGetHandle("")

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

    $aWl = WinList()
    For $i = 1 To $aWl[0][0]
    $sClass = _WinGetClass($aWl[$i][1])
    If $sClass = "CabinetWClass" Or $sClass = "ExploreWClass" Then
    WinSetState($aWl[$i][1],"",@SW_HIDE)
    Sleep(100)
    WinActivate($aWl[$i][1])
    ControlSend($aWl[$i][1],"","SysListView321","{F5}")
    WinActivate($hEnable)
    WinSetState($aWl[$i][1],"",@SW_SHOW)
    ConsoleWrite($aWl[$i][0]&" ["&$aWl[$i][1]&"] wurde Refreshed..." & @CRLF)
    EndIf
    Next
    EndFunc ;==>_RefeshExplorer

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

    ;by GtaSpider
    Func _WinGetClass($hWnd)
    Local $aDllRet
    ;hWnd des Fensters, Puffer(leer), Puffergroeße( ich hab 4096( #FFF ) bytes genommen)
    $aDllRet = DllCall($hDll, 'int', 'GetClassName', 'hwnd', $hWnd, 'str', '', 'int', 0xFFF)
    If @error Then Return SetError(@error, 0, 0)
    Return $aDllRet[2]
    EndFunc ;==>_WinGetClass

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

    ;am Ende
    Func OnAutoItExit()
    DllClose($hDll)
    EndFunc

    [/autoit]

    Mfg Spider

  • He da bin ich baff.
    Hab auch die ganze Zeit daran gearbeitet. aber zu keinem zufriedenstellenden Ergebnis gekommen.
    Mit "DllCall()" kenne ich mich gar nicht aus. Habs mal compiliert und es funktioniert.
    Kann man sogar noch erweitern.

    Xenobiologist
    Deine möglichkeit funktioniert im Scite-Editor wunderbar. Jedoch als "exe" geht gar nichts mehr, was ich so gar nicht verstehe.

    Spoiler anzeigen
    [autoit]


    Func _main()
    _changeFileVisible()
    If @error Then Exit
    ;~ _listWin()

    WinActivate('[CLASS:ExploreWClass]')
    ;~ WinWaitActive('[CLASS:ExploreWClass]')
    ControlSend('[CLASS:ExploreWClass]', '', '', '{F5}')
    EndFunc ;==>_main

    [/autoit]

    Ich habe heute leider keine Zeit mehr mich damit näher zu befassen, bleibe da aber auf jedenfall dran.
    Werd mich nochmal melden.
    Ich denke, dass das ein Thema ist, was viele interessieren könnte.

    Danke schonmal für die Lösungswege. You :rock: !!!

    Bis die Tage
    Patric

  • Hatte im Moment kaum Zeit mich darum zu kümmern jetzt aber mal ein kleines Update zur Lage.

    Alle Möglichkeiten die hier gelistet wurden geben nicht die 100%tige funktionalität der Aktualisierung.
    Es scheint da so eine Art Zufall zu geben (also manchmal geht es manchmal nicht :wacko: ).

    Hier noch eine Möglichkeit die ich gefunden hatte, allerdings mit den selben bescheidenen Ergebnissen.

    Spoiler anzeigen
    [autoit]


    #include <misc.au3>
    _SendMessage(0xffff,0x1A,0,0)

    [/autoit]


    Ich bleibe da weiter dran auch wenn ich so langsam ins zweifeln komme, ob es da wirklich eine saubere Lösung für gibt.

    Gruß
    Patric

  • Habs jetzt mal auf dem Weg gelöst, dass ich die Schritte einfach Automatisiert habe.
    Ist zwar nicht so elegant, Funktioniert aber auch.

    Spoiler anzeigen
    [autoit]


    Opt("WinWaitDelay", 0)
    ;
    ;===============================================================================
    ; Start Program
    ;===============================================================================
    _main()
    ;
    ;===============================================================================
    ; Functions
    ;===============================================================================
    Func _main()
    _changeFileVisible()
    If @error Then Exit
    Exit
    EndFunc ;==>_main
    ;
    Func _changeFileVisible()
    Local $i_State
    Local $i_TabControl
    ;
    $i_State = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden")
    If $i_State = 1 Then
    $i_Down = 16
    ElseIf $i_State = 2 Then
    $i_Down = 15
    EndIf
    Run("RunDll32.exe shell32.dll,Options_RunDLL 0")
    WinWait("Ordneroptionen", "")
    WinSetTrans("Ordneroptionen", "", 0)
    $h_Win = WinGetHandle("Ordneroptionen", "")
    ;
    While $i_TabControl <> 2
    $i_TabControl = ControlCommand($h_Win, "", "SysTabControl321", "CurrentTab", "")
    If $i_TabControl == 1 Then
    Sleep(200)
    ControlCommand($h_Win, "", "SysTabControl321", "TabRight", "")
    ElseIf $i_TabControl == 2 Then
    ElseIf $i_TabControl == 3 Then
    Sleep(200)
    ControlCommand($h_Win, "", "SysTabControl321", "TabLeft", "")
    ElseIf $i_TabControl == 4 Then
    Sleep(200)
    ControlCommand($h_Win, "", "SysTabControl321", "TabLeft", "")
    Sleep(200)
    ControlCommand($h_Win, "", "SysTabControl321", "TabLeft", "")
    EndIf
    WEnd
    ControlSend($h_Win, "", "", "{TAB}")
    ControlSend($h_Win, "", "", "{DOWN " & $i_Down & "}{SPACE}")
    Sleep(200)
    ControlSend($h_Win, "", "", "!b")
    ControlSend($h_Win, "", "", "{TAB}")
    ControlSend($h_Win, "", "", "{TAB}")
    ControlSend($h_Win, "", "", "{TAB}{ENTER}")
    Return 1
    EndFunc ;==>_changeFileVisible
    ;
    Func OnAutoItStart()
    If @OSVersion <> "WIN_XP" And @OSVersion <> "WIN_VISTA" Then
    MsgBox(48, "Hidden Files Toggle", 'Das Programm ist nur unter "Windows XP" geprüft!')
    Exit
    ElseIf @OSVersion = "WIN_VISTA" Then
    MsgBox(48, "Hidden Files Toggle", 'Du benutzt das Betriebssystem "Windows Vista". ' & @CR & 'Das Programm ist nur unter "Windows XP" geprüft!')
    Exit
    EndIf
    EndFunc ;==>OnAutoItStart

    [/autoit]


    Gruß
    Patric

  • sc4ry
    Das Problem liegt bei den Pausen zwichen den einzelnen "ControlSend´s".
    Ich hatte das bei mir nochmal gefixt mit glaube ich jeweils ein "sleep(100)" oder so.
    Da ich gerade nicht zu Hause bin kann ich das Skript leider jetzt nicht updaten.
    Ich werde wahrscheinlich morgen dazu kommen.

    gruß
    Patric

  • Super, freut mich zu hören, das das Skript, zumindest in der neuen Variante, auch bei anderen läuft.

    Patric