Desktop icons

  • Hi,

    hab no ein Problem,
    hab gegoogelt nach dem Schlüssel wo in der regestry die postion der Dekstop icons gespeichert sind.
    Hab in gefunden:
    "HKCU\Software\Microsoft\Windows\Shell\Bags\1\Desktop\ItemPos"

    Soweit so gut, nur wie lese ich jetzt die binädaten aus
    und woran erkkene ich was welches icon ist und wo es
    sich auf dem desktop befindet?

    2 Mal editiert, zuletzt von AutoItfreak (2. Juni 2012 um 16:13)

  • Warum benutzt Du nicht einfach folgende Funktionen dafür?

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=y ;Without this entry we could NOT read the Icons Text on a 64bit OS.
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>

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

    Global $sSettings = "C:\Temp\DesktopIcons.ini"
    _SaveDesktopIcons()
    MsgBox(64, "Benutzeraktion", "Bitte einige Icons verschieben, dann auf OK klicken")
    _RestoreDesktopIcons()
    Exit

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

    Func _SaveDesktopIcons()
    ;Veronesi
    FileDelete($sSettings)
    Local $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "[CLASS:SysListView32; INSTANCE:1]")
    For $i = 0 To _GUICtrlListView_GetItemCount($hDesktop) - 1
    IniWrite($sSettings, $i, "Name", _GUICtrlListView_GetItemText($hDesktop, $i))
    IniWrite($sSettings, $i, "X", _GUICtrlListView_GetItemPositionX($hDesktop, $i))
    IniWrite($sSettings, $i, "Y", _GUICtrlListView_GetItemPositionY($hDesktop, $i))
    Next
    EndFunc ;==>_SaveDesktopIcons

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

    Func _RestoreDesktopIcons()
    ;Veronesi
    Local $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "[CLASS:SysListView32; INSTANCE:1]")
    Local $fFound = False
    For $i = 0 To _GUICtrlListView_GetItemCount($hDesktop) - 1
    Local $sName = IniRead($sSettings, $i, "Name", "")
    $fFound = False
    For $j = 0 To _GUICtrlListView_GetItemCount($hDesktop) - 1
    If _GUICtrlListView_GetItemText($hDesktop, $j) = $sName Then
    $fFound = True
    ExitLoop
    EndIf
    Next
    If $fFound Then
    _GUICtrlListView_SetItemPosition($hDesktop, $j, IniRead($sSettings, $i, "X", "0"), IniRead($sSettings, $i, "Y", "0"))
    EndIf
    Next
    EndFunc ;==>_RestoreDesktopIcons

    [/autoit]

    Einfach ausführen, dann ein paar Icons verschieben und dann auf OK klicken => die Icons werden zurückgeschoben.

    Gruss, Veronesi

    Einmal editiert, zuletzt von veronesi (23. Juni 2012 um 19:55)

  • Hast du denn mal nachgeschaut, ob das INI File korrekt erstellt wurde?
    Ich vermute, bei dir stehen die Koordinaten zwar drin, aber der Name bleibt jeweils leer?!?!?!

    Und wenn du #AutoIt3Wrapper_UseX64=y auf n setzt?

    Gruss

  • Guck mal ob das Script bei dir funktioniert : Pastebin
    Während des laufens am besten die Raster Ausrichtung für deine Desktop Icons ausschalten.
    (Kannst du danach wieder anmachen) Musst dir deinen Desktop angucken nachdem du das Script gestartet hast^^.

    Wenns klappt kannst du dir das daraus ja zusammenbasteln.

  • Das Problem liegt vermutlich an dem nicht-existierenden Pfad C:\Temp\ .
    (war bei mir der Fall, als ich das testen wollte)
    Nach der Anpassung lief das Script prima! (Win7 x64)

    PS: Das Script wollte ich mir in kürze sehr umständlich via Snapshotvergleich nachbauen und per Maus...
    Dann dachte ich mir 'Da muss es was besseres für geben' und dann kommt dieses Script :thumbup:

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Ja, dass kann gut sein, dass es bei ihm den C:\Temp Pfad nicht gibt.
    Ich habe das Skript deshalb angepasst.

    Vielleicht läuft es nun.

    Desktop Save/Restore Icons
    [autoit]

    #AutoIt3Wrapper_UseX64=y ;Without this entry we could NOT read the Icons Text on a 64bit OS.
    #include <GuiListView.au3>

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

    DirCreate("C:\Temp")
    Global $sSettings = "C:\Temp\DesktopIcons.ini"
    _SaveDesktopIcons()
    MsgBox(64, "Benutzeraktion", "Bitte einige Icons verschieben, dann auf OK klicken")
    _RestoreDesktopIcons()
    Exit

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

    Func _SaveDesktopIcons()
    ;Veronesi
    FileDelete($sSettings)
    Local $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "[CLASS:SysListView32; INSTANCE:1]")
    For $i = 0 To _GUICtrlListView_GetItemCount($hDesktop) - 1
    IniWrite($sSettings, $i, "Name", _GUICtrlListView_GetItemText($hDesktop, $i))
    IniWrite($sSettings, $i, "X", _GUICtrlListView_GetItemPositionX($hDesktop, $i))
    IniWrite($sSettings, $i, "Y", _GUICtrlListView_GetItemPositionY($hDesktop, $i))
    Next
    EndFunc ;==>_SaveDesktopIcons

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

    Func _RestoreDesktopIcons()
    ;Veronesi
    Local $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "[CLASS:SysListView32; INSTANCE:1]")
    Local $fFound = False
    For $i = 0 To _GUICtrlListView_GetItemCount($hDesktop) - 1
    Local $sName = IniRead($sSettings, $i, "Name", "")
    $fFound = False
    For $j = 0 To _GUICtrlListView_GetItemCount($hDesktop) - 1
    If _GUICtrlListView_GetItemText($hDesktop, $j) = $sName Then
    $fFound = True
    ExitLoop
    EndIf
    Next
    If $fFound Then
    _GUICtrlListView_SetItemPosition($hDesktop, $j, IniRead($sSettings, $i, "X", "0"), IniRead($sSettings, $i, "Y", "0"))
    EndIf
    Next
    EndFunc ;==>_RestoreDesktopIcons

    [/autoit]