[..] Récuperer les icones par défaut

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[..] Récuperer les icones par défaut

#1

Message par Iste »

Salutations,

Je suis actuellement sur un 'mini client FTP'
J'pas de problème avec FTP.au3 ;) mais j'aimerai rendre mon script plus joli (enfin, le rendu du script hein) en affichant a coté des noms des dossiers fichiers des icones.
Seulement, pour ne pas devoir placer a coté toutes les icones qui existe (ca fait un petit nombre quand meme), j'aurai aimé que mon script cherche tout seul ce que windows a par défaut. Et dans toutes les taille si possible !

Seulement, pas moyen de trouver :( (je suis un tout petit peu nul en registe windows et tout et tout)
Donc voila, si vous pouviez me montrer le chemin...
Image

Merci !

PS : Je suis aussi preneur d'une petite fonction qui ferait directement tout toute seule ^^
(ouais je sais, j'apprendrais moins, mais bon, promis je lirais le code source)x
Signez ici
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Récuperer les icones par défaut

#2

Message par timmalos »

Tu peux regarder ce script:
SysControl.zip
(157.78 Kio) Téléchargé 91 fois
Apparemment, tu crées ca au début du script, ca sert de vérification pour savoir si on a une icône ou pas. Parce que si on en a pas, on en mets une générique

Code : Tout sélectionner

$dummy = GUICtrlCreateIcon("", 0, 0, 0)
GUICtrlSetState($dummy, $GUI_HIDE)
 
Puis tu fais comme ca:
En renseignant le Pid du programme.

Code : Tout sélectionner

$fName = _WinAPI_ProcessGetFilename($p_pid, True)
                $setImage = GUICtrlSetImage($dummy, $fName)
                If $setImage = 1 Then
                    $hImageIndex = _GUIImageList_AddIcon($hImage, $fName, 0)
                Else
                    $hImageIndex = _GUIImageList_AddIcon($hImage, "shell32.dll", 2)
                EndIf
                _GUICtrlListView_SetItemImage($hListview, $hLV_i, $hImageIndex, 0)

Code : Tout sélectionner

Func _WinAPI_ProcessGetFilename($vProcessID, $bFullPath = False)
    ; Not a Process ID? Must be a Process Name
    If Not IsNumber($vProcessID) Then
        $vProcessID = ProcessExists($vProcessID)
        ; Process Name not found (or invalid parameter?)
        If $vProcessID == 0 Then Return SetError(1, 0, "")
    EndIf

    Local $hProcess, $stFilename, $aRet, $sFilename, $sDLLFunctionName

    ; Since the parameters and returns are the same for both of these DLL calls, we can keep it all in one function
    If $bFullPath Then
        $sDLLFunctionName = "GetModuleFileNameEx"
    Else
        $sDLLFunctionName = "GetModuleBaseName"
    EndIf

    ; Get process handle (lod3n)
    Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "int", BitOR(0x400, 0x10), "int", 0, "int", $vProcessID)
    If @error Or Not IsArray($hProcess) Then Return SetError(2, 0, "")

    ; Create 'receiving' string buffers and make the call
    $stFilename = DllStructCreate("wchar[32767]")
    $aRet = DllCall("psapi.dll", "dword", $sDLLFunctionName & "W", "ptr", $hProcess[0], "ptr", Chr(0), "ptr", DllStructGetPtr($stFilename), "dword", 32767)

    ; Error from either call? Cleanup and exit with error
    If @error Or Not IsArray($aRet) Then
        ; Close the process handle
        DllCall("kernel32.dll", "ptr", "CloseHandle", "ptr", $hProcess[0])
        ; DLLStructDelete()'s:
        $stFilename = 0
        $hProcess = 0
        Return SetError(2, 0, "")
    EndIf

    ;$aRet[0] = size of string copied over, minus null-terminator
    ;$stFilename should now contain either the filename or full path string (based on $bFullPath)
    $sFilename = DllStructGetData($stFilename, 1)

    DllCall("kernel32.dll", "ptr", "CloseHandle", "ptr", $hProcess[0])
    ; DLLStructDelete()'s
    $stFilename = 0
    $hProcess = 0

    Return SetError(0, 0, $sFilename)
EndFunc   ;==>_WinAPI_ProcessGetFilename
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer les icones par défaut

#3

Message par Iste »

Déja, merci pour ta réponse !

Bien compliqué tout ca, mais après avoir biiiieeeen tout regardé et essayé de comprendre, bah ya une super fonction qui récup le path de l'exe a l'origine d'un process, c'est génial (j'avais cherché ca justement une foi) mais ca ne m'aide pas a retrouver l'icône associer a l'extension .rar par exemple :/

Enfin, ou bien j'ai encore passé a coté d'un truc, je continue de fouiller !

Edit :
Hum, en fait, les icones sont celle de l'exe qui est associé a l'extension (meme si des fois, c'est pas ca ><)
Donc récupérer l'adresse de l'exe, me restera plus qu'a en sortir l'icone !
Mais je sais ni ou il se trouve, ni comment leur piquer leur icone (meme si ca, on a déja du en parler sur le forum)
Signez ici
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Récuperer les icones par défaut

#4

Message par orax »

D'après ma recherche, je crois qu'on peut utiliser l'API SHGetFileInfo pour faire cela, et j'ai trouvé un exemple pour l'utiliser (un explorateur de fichiers) :
showtopic=92733&view=findpost&p=666842 (pour que ça marche bien : commentez la ligne 138).

Je suis également tombé sur cet exemple pour récupérer plusieurs tailles de l'icone (pour les .exe je crois) : showtopic=32476&view=findpost&p=237730.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer les icones par défaut

#5

Message par Iste »

Merci beaucoup, ca m'aide bien pour les listeview ^^
la fonction _GUIImageList_GetSystemImageList() couplé avec _GUIImageList_GetFileIconIndex() semble répondre a mes attentes.
En effet,

Code : Tout sélectionner

_GUICtrlListView_SetImageList($ListView1, _GUIImageList_GetSystemImageList(), 1) 
_GUICtrlListView_AddItem($hListView1, 'test', _GUIImageList_GetFileIconIndex('.rar'))
et hop j'ai l'icone que je veux :p
Maintenant plus qu'a récup les autre taille d'icone !
Signez ici
Répondre