PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → [WD15] icone de fichier
[WD15] icone de fichier
Iniciado por arnaud.borschneck, 12,ago. 2010 13:44 - 6 respuestas
Publicado el 12,agosto 2010 - 13:44
bonjour,

je recherche comment afficher l'icône d'un fichier (ou l'icône associé à un fichier) dans un tableau

j'ai tenté d'utiliser les différents exemples trouvés sur le net qui ne concernent que les icônes associés (API("SHELL32","ExtractIconExA", sDefaultIcon, nIconIndex, Null, &hIcon, 1) et API("SHELL32","ExtractIconA", 0, sDefaultIcon, nIconIndex) )

ils marchent pour beaucoup de cas, mais pas, par exemple pour les fichiers PDF.

Quelqu'un connaitrait-il un code qui fonctionne dans tous les cas ?

merci pour toute aide

Arnaud
Publicado el 12,agosto 2010 - 17:05
Publicado el 12,agosto 2010 - 19:32
merci pour votre réponse

étrangement, le problème est inverse du programme que j'avais trouvé sur le net.
Il me trouve l'icône du PDF, mais pas celui de Word ou Excel...

J'ai donc très légèrement modifié les deux codes pour que cela me donne un résultat.

dans le première procédure, si on ne trouve pas d'icône, au lieu de s'arrêter, on lance la procédure qui se trouve après (celle de FreeDev)

Dans les deux cas, je renvoie un image mémoire (car je veux ajouter l'icône en question dans un tableau)

Les problèmes que je rencontre :
- ce code ne fonctionne pas dans tous les cas (fichier TXT par exemple).
- je suis obligé de passer par un champs image dans la fenêtre.
- il est sans doute loin d'être optimisé

en attendant, il répond en bonne partie à mon souhait
si quelqu'un à une idée pour pour l'améliorer, je suis preneur ^_^

//////

// Résumé : Dessine l'icone associée à une extension de fichier, ou d'un fichier en particulier
// Paramètres :
// sFileName (chaîne) : Nom du fichier ou extension avec le "." (ex: ".doc")
// sNomChpImage (chaîne - valeur par défaut="") : Nom du Champ Image
// hDC (entier système - valeur par défaut=0) : ou hDC du champ image renvoyé par dDebutDessin()
// nTaille (entier - valeur par défaut=16) : 16, 32, 48, 64
// Valeur de retour :
// Type indéterminé :
// booléen
//
// Exemples :
// DessineIconeFichier(".doc","IMG_Icone")
// DessineIconeFichier("C:\Test.exe","",hDC)

PROCEDURE DessineIconeFichier(sFileName est chaîne, sNomChpImage est chaîne="", ...
LOCAL hDC est entier système=0, nTaille est entier = 32)

SI sNomChpImage<>"" _ET_ PAS ChampExiste(sNomChpImage) ALORS
RENVOYER ""
FIN

bRes est booléen

sDefaultIcon est chaîne = SysRep(srSystème) + "\SHELL32.DLL"
nIconIndex est entier
sFileExt est chaîne
sProgramName est chaîne
nbIcons,nIndex,nError sont entier
hIcon est entier système
SNomProgramme est une chaîne
nHndIcone est une chaîne

sFileExt = Minuscule(fExtraitChemin(sFileName,fExtension))

SELON sFileExt
CAS ".ico"
SI fFichierExiste(sFileName) ALORS
sDefaultIcon=sFileName
nIconIndex = 0
GOTO DRAW_ICON
FIN
CAS ".exe"
//sDefaultIcon = SysRep(srSystème) + "\SHELL32.DLL"
nIconIndex = 2
//Icone de l'executable (si nom de fichier complet fourni)
SI fFichierExiste(sFileName) ALORS
sDefaultIcon=sFileName
nIconIndex = 0
FIN
GOTO DRAW_ICON
FIN

SI RegistreExiste("HKEY_CLASSES_ROOT\"+sFileExt) ALORS
sProgramName = RegistreLit("HKEY_CLASSES_ROOT\"+sFileExt,0)
sDefaultIcon = RegistreLit("HKEY_CLASSES_ROOT\"+sProgramName + "\DefaultIcon",0)

nIndex = Position(sDefaultIcon, ",", Taille(sDefaultIcon), DepuisFin)
SI nIndex ALORS
sDefaultIcon = sDefaultIcon[[A nIndex-1]]
nIconIndex = sDefaultIcon[[nIndex+1 A]]
FIN
FIN

DRAW_ICON:
SI nTaille=16 ALORS
//Petite icone
nbIcons = API("SHELL32","ExtractIconExA", sDefaultIcon, nIconIndex, Null, &hIcon, 1)
FIN

SI hIcon DANS (-1,0,1) ALORS
//Icone standard
hIcon = API("SHELL32","ExtractIconA", 0, sDefaultIcon, nIconIndex)
FIN

SI hIcon DANS (-1,0,1) ALORS
RENVOYER IconeAssocieeFichier(sFileName, sNomChpImage)
SINON
SI sNomChpImage<>"" ALORS
{sNomChpImage,indChamp}..Visible=Faux
hDC = dDébutDessin(sNomChpImage)
nError = API("USER32","DrawIconEx",hDC, 0, 0, hIcon, nTaille, nTaille, 0, 0, 3)
{sNomChpImage,indChamp}..Visible=Vrai
SINON
nError = API("USER32","DrawIconEx",hDC, 0, 0, hIcon, nTaille, nTaille, 0, 0, 3)
FIN
FIN

API("USER32","DestroyIcon",hIcon)

RENVOYER dSauveImageJPEG(sNomChpImage,enMémoire)



///////


PROCEDURE IconeAssocieeFichier(sNomFichier, SChampImage)

sExtension est une chaîne
sNomProgramme est une chaîne
nHndIcone est un entier

SI sNomFichier = "" ALORS
RENVOYER ""
FIN

sExtension = fExtraitChemin(sNomFichier,fExtension)//Minuscule("." + ExtraitChaîne( sNomFichier, ChaîneOccurrence(sNomFichier,"."), 1,"."))
sNomProgramme = RegistreLit("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\" + sExtension,"")
sNomProgramme = RegistreLit( "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\" + sNomProgramme + "\shell\open\command", "")
sNomProgramme = Minuscule(sNomProgramme)

SI Position(sNomProgramme,"%systemroot%") <> 0 ALORS
sNomProgramme = Remplace(sNomProgramme,"%systemroot%",SysRep())
FIN
sNomProgramme = SansEspace(ExtraitChaîne(sNomProgramme,1,"%"))

//Suppression des guillemets :
sNomProgramme = Remplace(sNomProgramme,"""""","")
sNomProgramme = Remplace(sNomProgramme,Caract(34),"")
sNomProgramme = SansEspace(sNomProgramme)

//// Appel d`api pour recuperer le handle de l`icone de l`executable
nHndIcone = API("SHELL32","ExtractIconA",SysInstance(),sNomProgramme,0)
nHandleChpImage est un entier
nHandleChpImage = dDébutDessin(SChampImage)
API("user32","DrawIcon",nHandleChpImage,0,0,nHndIcone)

RENVOYER dSauveImageJPEG(SChampImage,enMémoire)
Miembro registrado
88 mensajes
Publicado el 12,febrero 2017 - 19:48
Bonjour,

Ayant la même problématique, je déterre ce sujet ancien.

Ci-joint un code que j'ai récupéré et adapté car j'avais des soucis pour récupérer les icônes des .txt et des .pdf.

PROCEDURE GLOBALE IconeFichier_Récupèrer(sFileName est chaîne, sNomChpImage est chaîne="",LOCAL hDC est entier système=0, nTaille est entier = 16)
SI sNomChpImage<>"" _ET_ PAS ChampExiste(sNomChpImage) ALORS
RENVOYER Faux
FIN

bRes est booléen

sDefaultIcon est chaîne = SysRep(srSystème) + "\SHELL32.DLL"
nIconIndex est entier
Extension est chaîne
sProgramName est chaîne
nbIcons,nIndex,nError sont entier
hIcon est entier système

Extension = Minuscule(fExtraitChemin(sFileName,fExtension))

SELON Extension
CAS ".ico"
SI fFichierExiste(sFileName) ALORS
sDefaultIcon=sFileName
nIconIndex = 0
GOTO DRAW_ICON
FIN
CAS ".exe"
// sDefaultIcon = SysRep(srSystème) + "\SHELL32.DLL"
nIconIndex = 2
// Icône de l'executable (si nom de fichier complet fourni)
SI fFichierExiste(sFileName) ALORS
sDefaultIcon=sFileName
nIconIndex = 0
FIN
GOTO DRAW_ICON
FIN

SI RegistreExiste("HKEY_CLASSES_ROOT\"+Extension) ALORS
sProgramName = RegistreLit("HKEY_CLASSES_ROOT\"+Extension,0)
sDefaultIcon = RegistreLit("HKEY_CLASSES_ROOT\"+sProgramName + "\DefaultIcon",0)
SI sDefaultIcon="" ALORS
sDefaultIcon = RegistreLit("HKEY_CLASSES_ROOT\"+sProgramName + "\shell\Open\command","")
SI sDefaultIcon=""
sDefaultIcon = RegistreLit("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\"+sProgramName + "\shell\Open\command","")
FIN
sDefaultIcon=SansCaractèreGauche(ExtraitChaîne(Minuscule(sDefaultIcon),1,".exe")+".exe","""")
nIconIndex = 0
GOTO DRAW_ICON
FIN

nIndex = Position(sDefaultIcon, ",", Taille(sDefaultIcon), DepuisFin)
SI nIndex ALORS
nIconIndex = sDefaultIcon[[nIndex+1 A]]
sDefaultIcon = sDefaultIcon[[A nIndex-1]]
FIN
FIN

DRAW_ICON:
OuvreFille(FEN_Icone)
FichierIcone est chaîne = fRepDonnées+"\"+Majuscule(SansCaractèreGauche(Extension,"."))+".BMP"
sNomChpImage=FEN_Icone.IMG_Icone..NomComplet
{sNomChpImage,indChamp}..Largeur=nTaille
{sNomChpImage,indChamp}..Hauteur=nTaille

SI nTaille=16 ALORS
// Petite icône
nbIcons = API("SHELL32","ExtractIconExA", sDefaultIcon, nIconIndex, Null, &hIcon, 1)
SINON
//Icone standard
hIcon = API("SHELL32","ExtractIconA", 0, sDefaultIcon, nIconIndex)
FIN

SI hIcon DANS (-1,0,1) ALORS
Ferme(FEN_Icone)
RENVOYER Faux
FIN

SI sNomChpImage<>"" ALORS
{sNomChpImage,indChamp}..Visible=Faux
hDC = dDébutDessin(sNomChpImage)
nError = API("USER32","DrawIconEx",hDC, 0, 0, hIcon, nTaille, nTaille, 0, 0, 3)
{sNomChpImage,indChamp}..Visible=Vrai
SINON
nError = API("USER32","DrawIconEx",hDC, 0, 0, hIcon, nTaille, nTaille, 0, 0, 3)
FIN
dSauveImageBMP(FEN_Icone.IMG_Icone, FichierIcone)

API("USER32","DestroyIcon",hIcon)
Ferme(FEN_Icone)

RENVOYER Vrai


Si cela peut servir à quelqu'un.
Miembro registrado
88 mensajes
Publicado el 21,febrero 2017 - 14:54
Bonjour,

Face à des cas particuliers non pris en compte par le code précédent, j'ai amélioré ce dernier.

Si cela intéresse quelqu'un, je tiens ce code à dispo.

A+
Miembro registrado
197 mensajes
Publicado el 30,agosto 2018 - 17:12
Bonjour

ayant voulu mettre les images des icones associées au fichier, je suis tombé sur la même problématique.
Je suis surpris qu'il n'existe pas de fonction native en windev permettant d'obtenir ceci. ;(

Pourrais tu fournir ton code amélioré Sylvain STP?
Pas insurmontable mais pas trop envie de me creuser la tête avec les API et compagnie...


Merci
Publicado el 27,agosto 2019 - 19:29
Bonsoir,

Ajoutez dans votre programme la ligne suivante

sNomProgramme= ExtraitChaîne(sNomProgramme,1,"/")

et ça fonctionne