Page 1 sur 2

Windows & icones

Publié : mer. 11/oct./2006 11:25
par Anonyme
Salut, je voulais savoir si on peut récuperer les coordonnées des icones windows via une api.

Merci.

@++

Re: Windows & icones

Publié : mer. 11/oct./2006 14:08
par lionel_om
Cpl.Bator a écrit :les coordonnées des icones windows
Quesako ? Tu veux dire l'index ou l'endroit où elles sont ?
Sinon ya pleins de codes sur le forum sur l'extractions d'icônes depuis les dll de sytem32...

Publié : mer. 11/oct./2006 14:22
par Anonyme
je parle des coordonées (leur positions) dans une fenetre ou sur le bureau.

Publié : mer. 11/oct./2006 17:45
par Flype
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...

Publié : mer. 11/oct./2006 18:12
par Anonyme
j'ai cherché aussi, mais les seuls truc que j'ai trouvé parlent de la base de registre, et à prioris , cela fonctionne lors de l'ouverture de session.
Mais comme tu l'a dit, lors d'un plantage ou changement de résolution, certain programme restore les icones.
Merci pour ton aide.

Publié : mer. 11/oct./2006 18:46
par Droopy
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()

Publié : mer. 11/oct./2006 19:03
par Anonyme
Merci Droopy, c'est exactement ce qu'il me fallait ! :D

Publié : mer. 11/oct./2006 20:18
par Droopy
L'auteur bloquait sur la mémorisation de l'emplacement des icones dans un fichier.
Si tu y parviens je suis preneur.
A+

Publié : mer. 11/oct./2006 22:35
par Anonyme
Bizarre , je bute aussi la dessus, j'ai virer la macro, j'additionne les x & y à la place, mais j'obtiens un resultat un resultat assez étrange. :?

Publié : mer. 11/oct./2006 23:08
par Flype
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 ?

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")


Publié : mer. 11/oct./2006 23:42
par Anonyme
Ca marche impec !

Merci Flype(buffer()) :D


@++ :wink:

Publié : jeu. 12/oct./2006 8:04
par Droopy
Nickel, même avec 3 écrans !

Publié : jeu. 12/oct./2006 10:48
par Backup
je lui est fait une petite interface :D



; 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")

Publié : jeu. 12/oct./2006 11:30
par Backup
Pardon petite correction apporté a l' interface ,...

Publié : jeu. 12/oct./2006 11:32
par Anonyme
Merci Dobro, tu m'a evité de me taper une interface :D