Windows & icones
Windows & icones
Salut, je voulais savoir si on peut récuperer les coordonnées des icones windows via une api.
Merci.
@++
Merci.
@++
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
Re: Windows & icones
Quesako ? Tu veux dire l'index ou l'endroit où elles sont ?Cpl.Bator a écrit :les coordonnées des icones windows
Sinon ya pleins de codes sur le forum sur l'extractions d'icônes depuis les dll de sytem32...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
oui çà existe... mais va falloir fouiller un peu.
en effet, certains programmes se souviennent de la position des
icones du bureau pour ensuite les restaurer après un changement
de résolution malencontreux (à cause d'un jeu, d'un plantage, ...)
il y a bien une fonction dans l'api windows pour enumerer les raccourcis du bureau et avoir des infos sur ceux ci. mais je me souviens plus trop.
je vais voir ce que je trouve...
en effet, certains programmes se souviennent de la position des
icones du bureau pour ensuite les restaurer après un changement
de résolution malencontreux (à cause d'un jeu, d'un plantage, ...)
il y a bien une fonction dans l'api windows pour enumerer les raccourcis du bureau et avoir des infos sur ceux ci. mais je me souviens plus trop.
je vais voir ce que je trouve...
Il y a ce code ( pas de moi) qui pourrait aider
Code : Tout sélectionner
;/ Sauvegarde et restore emplacement icones bureau
;/ Author : Michael Vogel
EnableExplicit
Global hProcess.l,ItemCount.l
Macro XMakeLong(a,b)
(a | b <<16)
EndMacro
Procedure GetSysLVHwnd()
;Handle des Desktop-ListView ermitteln
Protected h.l
h=FindWindow_("Progman",0)
h=FindWindowEx_(h,0,"SHELLDLL_defVIEW",0)
ProcedureReturn FindWindowEx_(h,0,"SysListView32",0)
EndProcedure
Procedure IsWindowsNT()
;NT oder nicht NT,das ist hier Frage
Protected OS.OSVERSIONINFO
OS\dwOSVersionInfoSize=SizeOf(OSVERSIONINFO)
GetVersionEx_(OS)
If OS\dwPlatformId=2
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure GetMemSharedNT(pid,memSize)
;Speicher für NT-Systeme reservieren
hProcess=OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE,0,pid)
ProcedureReturn VirtualAllocEx_(hProcess,0,memSize,#MEM_RESERVE | #MEM_COMMIT,#PAGE_READWRITE)
EndProcedure
Procedure FreeMemSharedNT(hP,MemAddress,memSize)
;Reservierten Speicher für NT-Systeme freigeben
VirtualFreeEx_(hP,MemAddress,memSize,#MEM_RELEASE)
CloseHandle_(hP)
EndProcedure
Procedure SaveIconPositions()
;Die Positionen der Desktop-Items speichern
Protected h,dwSize,lpSysShared,pid,lwritten,i
h=GetSysLVHwnd()
GetWindowThreadProcessId_(h,@pid)
ItemCount=SendMessage_(h,#LVM_GETITEMCOUNT,0,0)
h=GetSysLVHwnd()
Global Dim ptOriginal.POINT(ItemCount)
dwSize=SizeOf(POINT)
If IsWindowsNT()
lpSysShared=GetMemSharedNT(pid,dwSize)
WriteProcessMemory_(hProcess,lpSysShared,ptOriginal(0),dwSize,@lwritten)
For i=0 To ItemCount - 1
SendMessage_(h,#LVM_GETITEMPOSITION,i,lpSysShared)
ReadProcessMemory_(hProcess,lpSysShared,ptOriginal(i),dwSize,@lwritten)
Debug Hex(ptOriginal(i)\X)+","+Hex(ptOriginal(i)\Y)
;ptOriginal(i)\x+1
Next i
FreeMemSharedNT(hProcess,lpSysShared,dwSize)
EndIf
EndProcedure
Procedure RestoreIconPositions()
Protected h,i
h=GetSysLVHwnd()
For i=0 To ItemCount-1
SendMessage_(h,#LVM_SETITEMPOSITION,i,XMakeLong(ptOriginal(i)\x,ptOriginal(i)\y))
Next
EndProcedure
SaveIconPositions()
MessageRequester("","")
RestoreIconPositions()
mouai pas simple surtout avec ce tableau,
du coup j'ai simplifié en me passant des globales et du tableau,
j'utilise juste un p.POINT qui suffit et j'ai fais 2 procédures :
LoadDesktop("mon_bureau.ini") et
SaveDesktop("mon_bureau.ini")
çà marche chez moi - et vous ?
du coup j'ai simplifié en me passant des globales et du tableau,
j'utilise juste un p.POINT qui suffit et j'ai fais 2 procédures :
LoadDesktop("mon_bureau.ini") et
SaveDesktop("mon_bureau.ini")
çà marche chez moi - et vous ?
Code : Tout sélectionner
; PureBasic 4.0
; Enregistre et Restaure la position des icônes sur le bureau
EnableExplicit
Macro Listview_GetItemCount(hwnd)
SendMessage_(hwnd, #LVM_GETITEMCOUNT, #Null, #Null)
EndMacro
Macro Listview_SetItemPosition(hwnd, iItem, x, y)
SendMessage_(hwnd, #LVM_SETITEMPOSITION, iItem, ((y)<<16|(x)))
EndMacro
Macro Listview_GetItemPosition(hwnd, iItem, pPoint)
SendMessage_(hwnd, #LVM_GETITEMPOSITION, iItem, pPoint)
EndMacro
Procedure.l IsWindowsNT()
Protected OS.OSVERSIONINFO\dwOSVersionInfoSize = SizeOf(OSVERSIONINFO)
If GetVersionEx_(OS) And OS\dwPlatformId = 2
ProcedureReturn #True
EndIf
EndProcedure
Procedure.l GetDesktopHandle()
Protected hwnd.l = FindWindow_("Progman", 0)
hwnd = FindWindowEx_(hwnd, 0, "SHELLDLL_defVIEW", 0)
ProcedureReturn FindWindowEx_(hwnd, 0, "SysListView32", 0)
EndProcedure
Procedure.l LoadDesktop(FileName.s) ; Restaure la position des icônes du bureau depuis un fichier .INI
Protected hwnd.l, nItem.l, i.l
hwnd = GetDesktopHandle()
If hwnd
If OpenPreferences(FileName)
nItem = Listview_GetItemCount(hwnd)
For i = 0 To nItem - 1
If PreferenceGroup("ID." + Str(i))
Listview_SetItemPosition(hwnd, i, ReadPreferenceLong("x", 0), ReadPreferenceLong("y", 0))
EndIf
Next i
ClosePreferences()
EndIf
EndIf
ProcedureReturn nItem
EndProcedure
Procedure.l SaveDesktop(FileName.s) ; Enregistre la position des icônes du bureau dans un fichier .INI
Protected hwnd.l, pid.l, nItem.l, i.l, hProcess.l, hBuffer.l, written.l, p.POINT
hwnd = GetDesktopHandle()
If hwnd
If IsWindowsNT()
GetWindowThreadProcessId_(hwnd, @pid)
hProcess = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ, 0, pid)
If hProcess
hBuffer = VirtualAllocEx_(hProcess, 0, SizeOf(POINT), #MEM_RESERVE | #MEM_COMMIT, #PAGE_READWRITE)
If hBuffer
WriteProcessMemory_(hProcess, hBuffer, @p, SizeOf(POINT), @written)
If CreatePreferences(FileName)
nItem = Listview_GetItemCount(hwnd)
For i = 0 To nItem - 1
If Listview_GetItemPosition(hwnd, i, hBuffer)
If ReadProcessMemory_(hProcess, hBuffer, @p, SizeOf(POINT), @written)
PreferenceGroup("ID." + Str(i))
WritePreferenceLong("x", p\x)
WritePreferenceLong("y", p\y)
Debug Str(p\x) + ", " + Str(p\y)
EndIf
EndIf
Next i
ClosePreferences()
EndIf
VirtualFreeEx_(hProcess, hBuffer, SizeOf(POINT), #MEM_RELEASE)
EndIf
CloseHandle_(hProcess)
EndIf
EndIf
EndIf
ProcedureReturn nItem
EndProcedure
;SaveDesktop("mon_bureau.ini")
;LoadDesktop("mon_bureau.ini")
Dernière modification par Flype le jeu. 12/oct./2006 18:11, modifié 1 fois.
je lui est fait une petite interface 

; PureBasic 4.0
; Enregistre et Restaure la position des icônes sur le bureau
Macro Listview_GetItemCount(hwnd)
SendMessage_ (hwnd, #LVM_GETITEMCOUNT , #Null , #Null )
EndMacro
Macro Listview_SetItemPosition(hwnd, item, x, Y)
SendMessage_ (hwnd, #LVM_SETITEMPOSITION , item, ((Y)<<16|(x)))
EndMacro
Macro Listview_GetItemPosition(hwnd, iItem, pPoint)
SendMessage_ (hwnd, #LVM_GETITEMPOSITION , iItem, pPoint)
EndMacro
Declare.l IsWindowsNT()
Declare.l GetDesktopHandle()
Declare.l LoadDesktop(FileName.s)
Declare.l SaveDesktop(FileName.s)
Enumeration
#fenetre
#restore
#sauve
#text
EndEnumeration
OpenWindow ( #fenetre ,10,10,220,90, "pos_icone" , #PB_Window_SystemMenu )
Font1 = LoadFont ( #PB_Any , "Comic Sans MS" , 9, #PB_Font_Bold )
SetWindowColor ( #fenetre , RGB ($70,$89,$F1))
If CreateGadgetList ( WindowID (0))
TextGadget ( #text , 20,5,190, 20, "POS ICONES RECOVERER" , #PB_Text_Center )
SetGadgetFont ( #text , FontID (Font1))
SetGadgetColor ( #text , #PB_Gadget_BackColor , RGB ($70,$89,$F1))
ButtonGadget ( #restore , 10, 30, 200, 20, "Restore la position des icones du bureau" )
ButtonGadget ( #sauve , 10, 60, 200, 20, "Sauve la position des icones du bureau" )
EndIf
Repeat
Event= WaitWindowEvent ()
Select Event
Case #PB_Event_Gadget
Select EventGadget ()
Case #restore : Debug "restore"
CallDebugger
If FileSize ( "mon_bureau.ini" ) <>-1
LoadDesktop( "mon_bureau.ini" )
Else ; le fichier de sauvegarde n'existe pas
SaveDesktop( "mon_bureau.ini" ) ; alors on le creer !
EndIf
Case #sauve : Debug "sauve"
Resultat= MessageRequester ( "attention" , "vous voulez vraiment sauver la position des icones ?" , #PB_MessageRequester_YesNo )
EndSelect
If Resultat = 6 ; le bouton Oui a été choisi (Resultat = 6)
SaveDesktop( "mon_bureau.ini" )
Else ; le bouton Non a été choisi (Resultat = 7)
EndIf
Case #PB_Event_Menu
EndSelect
Until Event = #PB_Event_CloseWindow
Procedure.l IsWindowsNT()
Protected OS.OSVERSIONINFO\dwOSVersionInfoSize = SizeOf (OSVERSIONINFO)
If GetVersionEx_ (OS) And OS\dwPlatformId = 2
ProcedureReturn #True
EndIf
EndProcedure
Procedure.l GetDesktopHandle()
Protected hwnd.l = FindWindow_ ( "Progman" , 0)
hwnd = FindWindowEx_ (hwnd, 0, "SHELLDLL_defVIEW" , 0)
ProcedureReturn FindWindowEx_ (hwnd, 0, "SysListView32" , 0)
EndProcedure
Procedure.l LoadDesktop(FileName.s) ; Restaure la position des icônes du bureau depuis un fichier .INI
Protected hwnd.l, nItem.l, i.l
hwnd = GetDesktopHandle()
If hwnd
If OpenPreferences (FileName)
nItem = Listview_GetItemCount(hwnd)
For i = 0 To nItem - 1
If PreferenceGroup ( "ID." + Str (i))
Listview_SetItemPosition(hwnd, i, ReadPreferenceLong ( "x" , 0), ReadPreferenceLong ( "y" , 0))
EndIf
Next i
ClosePreferences ()
EndIf
EndIf
ProcedureReturn nItem
EndProcedure
Procedure.l SaveDesktop(FileName.s) ; Enregistre la position des icônes du bureau dans un fichier .INI
Protected hwnd.l, pid.l, nItem.l, i.l, hProcess.l, hBuffer.l, written.l, p.POINT
hwnd = GetDesktopHandle()
If hwnd
If IsWindowsNT()
GetWindowThreadProcessId_ (hwnd, @pid)
hProcess = OpenProcess_ ( #PROCESS_VM_OPERATION | #PROCESS_VM_READ , 0, pid)
If hProcess
hBuffer = VirtualAllocEx_ (hProcess, 0, SizeOf (POINT), #MEM_RESERVE | #MEM_COMMIT , #PAGE_READWRITE )
If hBuffer
WriteProcessMemory_ (hProcess, hBuffer, @p, SizeOf (POINT), @written)
If CreatePreferences (FileName)
nItem = Listview_GetItemCount(hwnd)
For i = 0 To nItem - 1
If Listview_GetItemPosition(hwnd, i, hBuffer)
If ReadProcessMemory_ (hProcess, hBuffer, @p, SizeOf (POINT), @written)
PreferenceGroup ( "ID." + Str (i))
WritePreferenceLong ( "x" , p\x)
WritePreferenceLong ( "y" , p\Y)
Debug Str (p\x) + ", " + Str (p\Y)
EndIf
EndIf
Next i
ClosePreferences ()
EndIf
VirtualFreeEx_ (hProcess, hBuffer, SizeOf (POINT), #MEM_RELEASE )
EndIf
CloseHandle_ (hProcess)
EndIf
EndIf
EndIf
ProcedureReturn nItem
EndProcedure
;SaveDesktop("mon_bureau.ini")
;LoadDesktop("mon_bureau.ini")
Dernière modification par Backup le jeu. 12/oct./2006 11:50, modifié 1 fois.