Hidden-Files Toggle

  • Aufgrund dieses Threads habe ich das Skript nochmals überarbeitet und hier rein gestellt.

    Das Skript prüft in der Registry wie der aktuelle Zustand der Versteckten Dateien ist. Danach ruft das Skript die Ordneroptionen auf und ändert den jew. Wert.

    Spoiler anzeigen
    [autoit]


    Opt("WinWaitDelay", 0)
    ;
    ;===============================================================================
    ;Start Program
    ;===============================================================================
    _main()
    ;
    ;===============================================================================
    ;Functions
    ;===============================================================================
    Func _main()
    _changeFileVisible()
    If @error Then Exit
    Exit
    EndFunc ;==>_main
    ;
    ;
    ;===============================================================================
    ; Function Name: _changeFileVisible
    ; Description: Prüft in der Registry wie der aktuelle Zustand der Versteckten Dateien ist.
    ; Danach ruft das Skript die Ordneroptionen auf und ändert den jew. Wert.
    ;
    ;
    ; Syntax: _changeFileVisible()
    ; Return Value(s): On Success -Return 1
    ;On Failure - Return 0
    ;
    ; Author(s): Patric Pendelin
    ;===============================================================================
    Func _changeFileVisible()
    Local $i_State
    Local $i_TabControl
    ;
    BlockInput(1)
    $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", "")
    Sleep(100)
    If $i_TabControl == 1 Then
    ;~ Sleep(100)
    ControlCommand($h_Win, "", "SysTabControl321", "TabRight", "")
    ElseIf $i_TabControl == 2 Then
    ElseIf $i_TabControl == 3 Then
    ControlCommand($h_Win, "", "SysTabControl321", "TabLeft", "")
    ElseIf $i_TabControl == 4 Then
    ControlCommand($h_Win, "", "SysTabControl321", "TabLeft", "")
    ControlCommand($h_Win, "", "SysTabControl321", "TabLeft", "")
    EndIf
    WEnd
    $i_CST = ControlSend($h_Win, "", "", "{TAB}")
    While $i_CST <> 1
    MsgBox(0, "", "blah1")
    WEnd
    $i_CST = ""
    $i_CST = ControlSend($h_Win, "", "", "{DOWN " & $i_Down & "}{SPACE}")
    While $i_CST <> 1
    WEnd
    $i_CST = ""
    $i_CST = ControlSend($h_Win, "", "", "!b")
    While $i_CST <> 1
    WEnd
    $i_CST = ""
    $i_CST = ControlSend($h_Win, "", "", "{TAB}")
    While $i_CST <> 1
    WEnd
    $i_CST = ""
    $i_CST = ControlSend($h_Win, "", "", "{TAB}")
    While $i_CST <> 1
    WEnd
    $i_CST = ""
    $i_CST = ControlSend($h_Win, "", "", "{TAB}{ENTER}")
    While $i_CST <> 1
    WEnd
    $i_CST = ""
    BlockInput(0)
    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]

    Mir wäre es lieb, wenn einer das Skript mal auf Windows Vista testen könnte.

    Patric

  • Ja super. Genau das ist es, was ich gesucht habe.
    Hatte das englische Board auch schon durchforstet, habe auch einige Threads gefunden mit leider
    immer nur sehr mangelhaften Ergebnissen.
    Die Möglichkeit den Weg mit der Ordneroption zu gehen war nur eine Notlösung,
    da ich hier schon einmal dies als Thema hatte und es mir keiner befriedigend beantworten konnte.

    Danke dir.

    Patric

  • So ich wusste den Thread im englischen Forum hatte ich auch schon gefunden, nur ging das Skript bei mir nicht.
    Jetzt weiß ich auch den Grund.

    Bei dem Explorer-Refresh werden dort erst alle Fenster der Klasse "CabinetWClass" in ein Array geschrieben und
    jedes einzelne mit dem DllCall refreshed.
    Bei mir haben aber zumindest die meisten Explorer-Fenster die Klasse "ExploreWClass"
    Wenn man jetzt diese Fenster auch sucht und refreshed geht es.

    Kann mir jemand den Grund für das Auftreten dieser zwei Explorer classnamen nennen?

    Hier mal das Skript nur für das Hidden-Files Toggle

    Spoiler anzeigen
    [autoit]


    ;===============================================================================
    ; AutoItSetOption
    ;===============================================================================
    ;#NoTrayIcon
    Opt("WinTitleMatchMode", 4)
    Opt("MustDeclareVars", 1)
    ;
    ;===============================================================================
    ; Start Program
    ;===============================================================================
    _main()
    ;
    ;===============================================================================
    ; Functions
    ;===============================================================================
    Func _main()
    _changeFileVisible()
    EndFunc ;==>_main
    ;
    Func _changeFileVisible()
    Local $s_RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
    Local $i_State = RegRead($s_RegKey, "Hidden")
    ;
    If $i_State = 1 Then
    RegWrite($s_RegKey, "Hidden", "REG_DWORD", "2")
    Else
    RegWrite($s_RegKey, "Hidden", "REG_DWORD", "1")
    EndIf
    _refreshExplorer()
    EndFunc ;==>_changeFileVisible
    ;
    Func _refreshExplorer()
    Local $ah_WinList1 = WinList("classname=ExploreWClass")
    Local $ah_WinList2 = WinList("classname=CabinetWClass")
    Local $h_Desktop = WinGetHandle("classname=Progman")
    ;
    ; Aktualisieren der "ExploreWClass" Fenster
    If $ah_WinList1[0][0] > 0 Then
    ;_ArrayDisplay($ah_WinList1, "$ah_WinList1")
    For $i = 1 To $ah_WinList1[0][0] Step 1
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $ah_WinList1[$i][1], "int", 0x111, "int", 28931, "int", 0)
    Next
    EndIf
    ;
    ; Aktualisieren der "CabinetWClass" Fenster
    If $ah_WinList2[0][0] > 0 Then
    ;_ArrayDisplay($ah_WinList2, "$ah_WinList2")
    For $i = 1 To $ah_WinList1[0][0] Step 1
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $ah_WinList1[$i][1], "int", 0x111, "int", 28931, "int", 0)
    Next
    EndIf
    ;
    ; Aktualisieren des "Desktops"
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $h_Desktop, "int", 0x111, "int", 28931, "int", 0)
    EndFunc ;==>_refreshExplorer

    [/autoit]
  • Es gint einmal die Explorer, die mit dem Arbeitsplatz aufgerufen werden und 2. die Fenster, die über Win-E oder über explorer.exe aufgerufen werden :) Da gibt es dann 2 verschiedene Namen.

  • Ja sowas hatte ich mir schon gedacht.
    Ich bin ein Baumstruckturfanatiker, weswegen ich alle Fenster über die explorer.exe aufrufe.
    Bin jedenfalls froh das es so läuft.

    Patric