Windows & icones

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Anonyme

Windows & icones

Message par Anonyme »

Salut, je voulais savoir si on peut récuperer les coordonnées des icones windows via une api.

Merci.

@++
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Re: Windows & icones

Message 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...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme

Message par Anonyme »

je parle des coordonées (leur positions) dans une fenetre ou sur le bureau.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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...
Image
Anonyme

Message 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.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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()
Anonyme

Message par Anonyme »

Merci Droopy, c'est exactement ce qu'il me fallait ! :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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+
Anonyme

Message 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. :?
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

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

Dernière modification par Flype le jeu. 12/oct./2006 18:11, modifié 1 fois.
Image
Anonyme

Message par Anonyme »

Ca marche impec !

Merci Flype(buffer()) :D


@++ :wink:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Nickel, même avec 3 écrans !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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")
Dernière modification par Backup le jeu. 12/oct./2006 11:50, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Pardon petite correction apporté a l' interface ,...
Anonyme

Message par Anonyme »

Merci Dobro, tu m'a evité de me taper une interface :D
Répondre