Desktop Icons speichern/restoren mit zwei ausführbaren scripten ohne GUI

  • Hab die gleiche Fehlermeldung und bei mir geht auch kein Wiederherstellen...
    Wie gesagt schau dir mal http://www.midiox.com/index.htm -> 'Desktop Restore' an.
    Ein Batch und schon hast du's.
    Dann mußt du das nicht alles zu Fuß machen.
    Oder warte bis McPoldy seine (eigene) Version fertig hat :P

  • Bin schon fleißig, habs hinbekommen das ich meinen Eigenen Dateien Ordern mit einem Script sicher und wiederherstellen kann, aber Anforderung waren ja 2 Scripte, also bastel ich mal weiter, hab ich heute was im Zug zu tun :)

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

  • So, hier mal für alle das originalScript. Jetzt Fuktionsfähig:
    Benutzt _GUICtrlListView_SetItemPosition statt _GUICtrlListView_SetItemPosition32
    und die Reihenfolge der Argumente bei _GUICtrlListView_SetItemText musste angepasst werden.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListView.au3>
    #include <File.au3>
    #include <GuiConstantsEx.au3>

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

    $guiwindow = GUICreate("Window Selection", 350, 150)
    $font = "Arial Bold"

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

    $LoadB = GUICtrlCreateButton(" Load ", 5, 123)
    $SaveB = GUICtrlCreateButton(" Save ", 45, 123)
    GUICtrlSetFont(-1, 8.5, 400, -1, $font)
    $refreshbutton = GUICtrlCreateButton("Refresh", 100, 123, 60, 25)
    GUICtrlSetFont(-1, 8.5, 400, -1, $font)
    $iListview = GUICtrlCreateListView(" Title|State ", 0, 0, 350, 120)
    $nListview = GUICtrlGetHandle($iListview)
    GUICtrlSendMsg($nListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($nListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)

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

    RefreshWidth()
    Func RefreshWidth()
    _GUICtrlListView_SetColumnWidth($nListview,1,$LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($nListview,1,_GUICtrlListView_GetColumnWidth ($nListview,1)-2)
    EndFunc

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

    ListWindows()

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

    LoadInis() ; only that one visible in ListView

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_Event_Close
    GUIDelete($guiwindow)
    Exit
    Case $msg = $LoadB
    Restore()
    ContinueLoop
    Case $msg = $SaveB
    Save()
    ListWindows()
    LoadInis()
    ContinueLoop
    Case $msg = $refreshbutton
    ListWindows()
    LoadInis()
    EndSelect
    WEnd

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

    Exit

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

    Func ListWindows()
    GUISetState(@SW_SHOW)
    _GUICtrlListView_DeleteAllItems ($nListview)
    $aWindows = WinList("[CLASS:CabinetWClass]") ; To remove visible windows take out 'IsVisible' function.
    For $i = 1 To $aWindows[0][0]

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

    ;~ MsgBox(0, 0, "You choose: " & ControlGetText ($aWindows[$i][0], "", "SysListView321"))
    If $aWindows[$i][0] <> "" And ControlGetText ($aWindows[$i][0], "", "SysListView321") = "FolderView" Then
    GUICtrlCreateListViewItem($aWindows[$i][0], $iListview)
    EndIf
    Next
    GUICtrlCreateListViewItem("Program Manager(Desktop)", $iListview)
    _GUICtrlListView_SetColumnWidth($nListview, 0, $LVSCW_AUTOSIZE)

    EndFunc ;==>ListWindows

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

    Func LoadInis()

    $FileList =_FileListToArray(@ScriptDir & "\WindowsPos","*.ini")
    If @error <> 0 Then
    If @error = 1 Then DirCreate ( @ScriptDir & "\WindowsPos" )
    Return -1
    EndIf

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

    For $i = 0 To _GUICtrlListView_GetItemCount ($nListview)-1
    $name = _GUICtrlListView_GetItemText ( $nListview, $i ,0)
    If @error <> 0 Then Return False
    $Load = LoadIni($name,$i)
    If $Load Then
    _GUICtrlListView_SetItemText ( $nListview, $i, $Load ,1)
    EndIf
    Next

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

    RefreshWidth()
    EndFunc

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

    Func LoadIni($name,$listnr)

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

    Dim $PosList[1][3]

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

    If Not FileExists(@ScriptDir & "\WindowsPos\"&$name&".ini") Then Return False ; keine Ini gefunden
    $IniSec = IniReadSection (@ScriptDir & "\WindowsPos\"&$name&".ini","Positions by Name")
    If @error=1 Then
    Return "Error in ini" ; ini gefunden aber fehlerhaft
    EndIf

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

    Return "Positions found"

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

    EndFunc

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

    Func Restore()
    $winname = _GUICtrlListView_GetItemText ( $nListview, _GUICtrlListView_GetSelectedIndices($nListview) ,0)
    MsgBox(0, '', $winname)
    If $winname = "Program Manager(Desktop)" Then
    $handle = ControlGetHandle("Program Manager", "", "SysListView321")
    Else
    $handle = ControlGetHandle($winname, "", "SysListView321")
    EndIf
    _GUICtrlListView_BeginUpdate ($handle)
    For $i = 0 To _GUICtrlListView_GetItemCount ($handle)
    $name = _GUICtrlListView_GetItemText ($handle, $i)
    $x = IniRead(@ScriptDir & "\WindowsPos\"&$winname&".ini", "Positions by Name", $name & "x", "Unknown")
    $y = IniRead(@ScriptDir & "\WindowsPos\"&$winname&".ini", "Positions by Name", $name & "y", "Unknown")
    If $x <> "Unknown" Then
    _GUICtrlListView_SetItemPosition ($handle, $i, $x, $y)
    EndIf
    Next
    _GUICtrlListView_EndUpdate ($handle)
    EndFunc ;==>Restore

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

    Func Save()
    $winname = _GUICtrlListView_GetItemText ( $nListview, _GUICtrlListView_GetSelectedIndices($nListview))
    If $winname = "Program Manager(Desktop)" Then
    $handle = ControlGetHandle("Program Manager", "", "SysListView321")
    Else
    $handle = ControlGetHandle($winname, "", "SysListView321")
    EndIf
    If @error = 1 Then MsgBox(0,0," Error(ControlGetHandle) : cant get handle")
    $t= MsgBox(4, "Confirm","Window Name: "&$winname&@CRLF& _
    "Icon Count: "&_GUICtrlListView_GetItemCount ($handle)&@CRLF& _
    "Name of first Icon: "&_GUICtrlListView_GetItemText($handle, 0)&@CRLF&@CRLF& _
    " Do you really want to save?")
    If $t <> 6 Then Return
    _GUICtrlListView_SetItemText ( $nListview, _GUICtrlListView_GetSelectedColumn ($nListview), 1, "saving..." )
    FileDelete(@ScriptDir & "\WindowsPos\"&$winname&".ini")
    For $i = 0 To _GUICtrlListView_GetItemCount ($handle)
    $pos = _GUICtrlListView_GetItemPosition ($handle, $i)
    $name = _GUICtrlListView_GetItemText ($handle, $i)
    If $pos[0] = True Then
    IniWrite(@ScriptDir & "\WindowsPos\"&$winname&".ini", "Positions by Name", $name & "x", $pos[0])
    IniWrite(@ScriptDir & "\WindowsPos\"&$winname&".ini", "Positions by Name", $name & "y", $pos[1])
    EndIf
    Next
    _GUICtrlListView_SetItemText ( $nListview, _GUICtrlListView_GetSelectedIndices ($nListview), "done" ,1)
    RefreshWidth()
    Sleep(1500)
    EndFunc ;==>Save

    [/autoit]

    McPoldy: Mach 1 Script, das mit Commandline Argumenten geht :)
    Ohne Argumente macht es Restore, wenn man es mit Script.exe -save aufruft, dann Speichert es.

  • Hier erst einmal was gaaanz einfaches, wenn das Script gestartet wird, werden die Positionen gespeichert, wird das Script beendet, dann werden die Icons wiederhergestellt.
    Wichtig, wenn das Scipt läuft keine Icons hinzufügen oder entfernen!!!! Ist ja auch nur die erste Version :)

    @progandy Dein Wunsch ist mir Befehl ;) denke auch mal das es so am sinnvollsten ist.

    Spoiler anzeigen
    [autoit]


    #Include <GuiListView.au3>

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

    Opt("OnExitFunc","OnAutoItExit")

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

    $handle = ControlGetHandle("Program Manager", "", "SysListView321")
    $anzIcons = _GUICtrlListView_GetItemCount ($handle)
    Dim $arrPos[$anzIcons][3]
    For $i = 0 To $anzIcons -1
    $arrPos[$i][0] = _GUICtrlListView_GetItemPositionX ($handle,$i)
    $arrPos[$i][1] = _GUICtrlListView_GetItemPositionY ($handle,$i)
    $arrPos[$i][2] = _GUICtrlListView_GetItemText($handle,$i)
    Next

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

    While 1
    Sleep(10)
    WEnd

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

    Func OnAutoItExit()
    For $i = 0 To $anzIcons -1
    _GUICtrlListView_SetItemPosition($handle,$i,$arrPos[$i][0],$arrPos[$i][1])
    Next
    EndFunc

    [/autoit]

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)