Code: Select all
EnableExplicit
Structure DeskInfo
sz.i
name.s
pt.point
EndStructure
Global Dim GlobalDeskinfo.DeskInfo(0)
Global Explorer
Global GlobalLVItem
Global GlobalBuffer
Procedure DesktopHandle()
Static Desktop
If Not Desktop
Desktop = FindWindow_("ProgMan",#Null)
Desktop = GetWindow_ (Desktop,#GW_CHILD)
Desktop = GetWindow_ (Desktop,#GW_CHILD)
EndIf
ProcedureReturn Desktop
EndProcedure
Procedure DesktopProcessOpen()
Protected ExplorerID
Protected Flags = #PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE | #PROCESS_QUERY_INFORMATION
GetWindowThreadProcessId_(DesktopHandle(),@ExplorerID)
Explorer = OpenProcess_(Flags,#Null,ExplorerID)
GlobalLVItem = VirtualAllocEx_(Explorer,#Null,SizeOf(LV_ITEM),#MEM_COMMIT,#PAGE_READWRITE )
GlobalBuffer = VirtualAllocEx_(Explorer,#Null,#MAX_PATH,#MEM_COMMIT,#PAGE_READWRITE)
Protected Item.LV_ITEM
With Item
\mask = #LVIF_TEXT
\iSubItem = 0
\pszText = GlobalBuffer
\cchTextMax = #MAX_PATH
EndWith
WriteProcessMemory_(Explorer,GlobalLVItem,Item,SizeOf(LV_ITEM),#Null)
EndProcedure
Procedure DesktopProcessClose ( )
VirtualFreeEx_(Explorer,GlobalLVItem,#Null,#MEM_RELEASE)
VirtualFreeEx_(Explorer,GlobalBuffer,#Null,#MEM_RELEASE)
CloseHandle_(Explorer)
EndProcedure
Procedure DesktopIconCount ( )
ProcedureReturn SendMessage_(DesktopHandle(),#LVM_GETITEMCOUNT,#Null,#Null)
EndProcedure
Procedure.s DesktopGetIconString(Index)
Protected String$=Space(#MAX_PATH)
SendMessage_(DesktopHandle(),#LVM_GETITEMTEXT,Index,GlobalLVItem)
ReadProcessMemory_(Explorer,GlobalBuffer,@String$,#MAX_PATH,#Null)
ProcedureReturn String$
EndProcedure
Procedure DesktopGetIconPosition(index,*pt.point)
If SendMessage_(DesktopHandle(),#LVM_GETITEMPOSITION,index,GlobalLVItem )
ReadProcessMemory_(Explorer,GlobalLVItem,*pt,SizeOf(Point),#Null)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure DesktopSetIconPos(Index,X,Y)
ProcedureReturn SendMessage_(DesktopHandle(),#LVM_SETITEMPOSITION,Index,(Y<<16)|(X&$FFFF))
EndProcedure
Procedure SaveDesktopIconsPositions()
Protected fn,Count,index,pt.point,name.s
fn = OpenFile(-1,"desk.bin")
If fn
DesktopProcessOpen()
Count = DesktopIconCount()
ReDim GlobalDeskinfo.DeskInfo(count)
WriteData(fn,@count,SizeOf(Integer))
For index = 0 To Count - 1
GlobalDeskinfo(index)\name = DesktopGetIconString(index)
GlobalDeskinfo(index)\sz = Len(GlobalDeskinfo(index)\name)
If DesktopGetIconPosition(index,pt)
GlobalDeskinfo(index)\pt\x = pt\x
GlobalDeskinfo(index)\pt\y = pt\y
EndIf
WriteData(fn,@GlobalDeskinfo(index)\sz,SizeOf(Integer))
WriteData(fn,@GlobalDeskinfo(index)\name,GlobalDeskinfo(index)\sz)
WriteData(fn,@GlobalDeskinfo(index)\pt,SizeOf(point))
Next
CloseFile(fn)
EndIf
DesktopProcessClose()
EndProcedure
Procedure RestoreDesktopIconsPositions()
Protected count,*buf,name.s,len,pt.point,fn,index
*buf = AllocateMemory(#MAX_PATH)
count = ArraySize(GlobalDeskinfo())
DesktopProcessOpen()
If count > 0
For index = 0 To count
DesktopSetIconPos(index,GlobalDeskinfo(index)\pt\x,GlobalDeskinfo(index)\pt\y)
Next
Else
fn = ReadFile(-1,"desk.bin")
If fn
ReadData(fn,@count,SizeOf(Integer))
If count > 0
For index = 0 To count
ReadData(fn,@len,SizeOf(Integer))
ReadData(fn,*buf,len)
name = PeekS(*buf,len)
ReadData(fn,@PT,SizeOf(point))
If DesktopGetIconString(index) = name
DesktopSetIconPos(index,pt\x,pt\y)
EndIf
Next
EndIf
CloseFile(fn)
EndIf
EndIf
DesktopProcessClose()
FreeMemory(*buf)
EndProcedure
Define EV,EVG
OpenWindow(0,200,200,140,30,"desk Icons",#PB_Window_SystemMenu)
ButtonGadget(1,5,5,60,20,"save")
ButtonGadget(2,70,5,60,20,"restore")
Repeat
EV = WaitWindowEvent()
If EV
EVG = EventGadget()
If EVG = 1
SaveDesktopIconsPositions()
ElseIf EVG = 2
RestoreDesktopIconsPositions()
EndIf
EndIf
Until EV = #WM_CLOSE