IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[Demande]Changer l'icone d'un fichier


Sujet :

Windows Forms

  1. #61
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    J'ai fait se que tu ma dis et non avec regsvr32 ca marche pas encore (j'avais déja essayé avant).

    J'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    regsvr32.exe /i *LeNomdeMonDll.dll*
    se qui ma renvoyé:
    *Path+LeNomdeMonDll.dll* a été chargé mais le point d'entrée DllRegisterServer est introuvable.

    Ce fichier ne peut pas être être enregistrer.
    Et apres j'ai essayée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Le parametre "/n" s'utilise avec "/i" et sert à ne pas appeler DllRegisterServer.
    regsvr32.exe /i /n *LeNomdeMonDll.dll*
    se qui ma renvoyer:
    *Path+LeNomdeMonDll.dll* a été chargé mais le point d'entrée DllInstall est introuvable.

    Ce fichier ne peut pas être être enregistrer.

  2. #62
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Bon voila , le problème de l'enregistrement dans le registre est résolue, j'ai réussi à enregistré mon DLL avec "RegAsm.exe", fichier qui vient avec .Net Framework et qui sert à enregistrer les Assembly.

    L'IconHandler est maintenant présent pour ".customExtension" dans le registre mais les icônes change pas, "empty.customExtension" (vide) n'a pas changé ainsi que "full.customExtension" (Avec texte).

    La clé dans mon registre doit elle se nommer ".CUSTOMEXTENSION" ou "CUSTOMEXTENSION"? EDIT:Question résolu, il faut marquer ".customExtension" mais les icônes changes toujours pas , j'ai beau redémmaré l'Explorer.

  3. #63
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Si elles ne changent pas, c'est certainement que tu as une erreur dans ton code ! Le code que je t'ai fourni fonctionne, alors cherche peut-être les différences avec le tien.

  4. #64
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Bah j'ai changer le chemin des images bmp par d'autre bmp comme tu la dit.
    Apart ca j'ai rien modifier.

    Tu crois tu qu'ajouter un Msgbox("Test") me permetterais de voir si l'IconHandler est prit en charge?

  5. #65
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Pas de problème. Rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox(Me.Filename)
    si tu veux voir le fichier traité.
    Par contre, redémarre bien l'explorateur (tu peux tuer le process puis le relancer via la commande d'exécution du gestionnaire de tâches).

  6. #66
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Non ca marche pas encore ,j'ai redémarré Explorer.exe mais aucun message n'apparait quand je visualise les fichier ".customExtension" dans l'explorateur et biensûr les icône ne change pas, il reste à testé en redémarrant l'ordinateur au complet mais la j'ai plein de truc d'ouvert.

    Merci d'avance pour l'aide que tu va encore me fournire !!

  7. #67
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Non , ca ne fonctionne pas, j'ai redémarré et ca ne marche pas encore, aucun Message n'apparait et aucun changement d'icônes.

  8. #68
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Je garde toujours espoir?
    Aider moi encore svp!

    Je laisse le code de la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Option Explicit On
    Option Strict On
     
    Imports System
    Imports System.Drawing
    Imports Microsoft.VisualBasic
    Imports Edanmo.ShellExtensions
     
    Namespace CustomShellExtension
     
        < _
           ExtensionFileTypes(".customExtension"), _
           ComClass(CustomShellExtension.ClassId, CustomShellExtension.InterfaceId, CustomShellExtension.EventsId) _
        > _
         Public Class CustomShellExtension
            Inherits Edanmo.ShellExtensions.IconHandlerBase
     
            Public Const ClassId As String = "771B82BB-5A8C-43f0-B3E0-E3D25A1F7F95"
            Public Const InterfaceId As String = "F856C01B-36DE-4b7b-8EF4-2AE03CB90548"
            Public Const EventsId As String = "1C500ECD-EAC3-4ddd-9F34-AEC22AEF1AE9"
     
            Public Overrides Sub OnExtractIcon(ByVal Filename As String, ByVal IconIndex As Integer, ByRef LargeIcon As IntPtr, ByRef SmallIcon As IntPtr, ByVal LargeSize As Integer, ByVal SmallSize As Integer)
     
                Dim currentFileInfo As New System.IO.FileInfo(Me.Filename)
                Dim imagePath As String = "C:\Documents and Settings\Administrateur\Mes documents\Mes images\power1.bmp" 'Image Full
                If (currentFileInfo.Length = 0) Then
                    imagePath = "C:\Documents and Settings\Administrateur\Mes documents\Mes images\junky1.bmp" ' Image Vide
                End If
                Dim Image As New Bitmap(imagePath)
                Dim Large, Small As Bitmap
     
                ' Create a large and small thumbnail
                Small = DirectCast(Image.GetThumbnailImage(SmallSize, SmallSize, Nothing, IntPtr.Zero), Bitmap)
                Large = DirectCast(Image.GetThumbnailImage(LargeSize, LargeSize, Nothing, IntPtr.Zero), Bitmap)
     
                ' Convert the thumbnails to icons
                LargeIcon = Large.GetHicon()
                SmallIcon = Small.GetHicon()
     
                Small.Dispose()
                Large.Dispose()
                Image.Dispose()
                MsgBox(Me.Filename)
            End Sub
     
            Public Overrides Function OnGetIconLocation(ByRef IconFile As String, ByRef IconIndex As Integer, ByVal Flags As Edanmo.ShellExtensions.IconHandlerFlags) As IconHandlerReturnFlags
                Return IconHandlerReturnFlags.PerInstance Or IconHandlerReturnFlags.DontCache
            End Function
     
        End Class
    End Namespace
    Et le fichier attaché c'est le raport du IconHandler fait par ShellExView (il regard dans le registre et renvoi les informations)
    Fichiers attachés Fichiers attachés

  9. #69
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Personnellement y a 2 trucs qui me chiffonnent dans ce code...
    - pourquoi utiliser Me.Filename plutôt que le Filename passé en paramètre ?
    - Pourquoi appeler Dispose sur les icônes avant de quitter la fonction ? Ca va rendre invalides les 2 HICON qu'on vient d'obtenir... non ?

    BCmDev, en tant qu'auteur de ce code, tu peux nous éclaircir ?

  10. #70
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Quoi!?!? Toujours pas de nouvelle réponce!!

    Oh ben je suis bon pour la corde CYA!!


    Non sérieusement, BCmDev j'attende[EDIT] ton aide avec impatience!!

  11. #71
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par slayer418 Voir le message
    Non sérieusement, BCmDev j'attendais ton aide avec impatience!!
    Ca fait quelques jours que je ne l'ai pas vu sur le forum, il est peut-être en vacances...

  12. #72
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Comme si souvent, tomlev avait la bonne réponse : quelques jours de repos ne font pas de mal de temps en temps...
    Juste pour rappel, je ne suis l'auteur de quasiment aucun code. Je n'ai fait qu'adapter l'exemple fourni par Eduardo A. Morcillo. Cependant, pour répondre aux question de tomlev, je peux dire que dans mon cas, le paramètre FileName est vide. Je ne me suis pas penché sur les raisons du pourquoi, mais cela semble provenir de la méthode IExtractIconW.Extract.
    J'avoue slayer418 ne plus savoir quoi faire pour t'aider. Tout fonctionne sur mon poste et il est toujours difficile d'imaginer ce qui peut se passer sur un autre, surtout quand on parle d'extensions du shell, domaine oh combien délicat.
    Ce que je peux te proposer (si tu ne l'as pas encore fait), c'est de débugguer l'extension :
    - dans les propriétés de ton projet, indique C:\Windows\Explorer.exe (ou autre suivant ta configuration) comme programme externe pour démarrer l'application.
    - met un point d'arrêt à l'entrée de OnExtractIcon par exemple
    - ferme toutes les fenêtres de l'explorateur
    - tue le process explorer.exe (la barre des tâches va disparaître)
    - lance ton environnement de développement

    En espérant sincèrement que cela va te faire progresser dans la résolution de ton problème...

  13. #73
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Salut!!

    Je comprend pas comment mettre Explorer.exe en programme externe , je vais dans les propriété de la classe mais je trouve rien pour précisé un quelconque fichier.

    Merci d'Avance!!

  14. #74
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Dans ma version, cela se présente ainsi :
    Projet properties \ Onglet Debug \ paramètre Start Action \ Bouton radio Start external program.

  15. #75
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    HAAAAAAAAAAAAAAAAAAAaaaaaaaa!!


    YEah , apres 1 mois sans reparler (et sans refaire de vb.NET, mois de php ) , hier soir je me suis dis que je ne pouvais abandonné ce projet comme ca alors je me suis mit à essayer des facons de faire fonctionner la Class de BCmDev, j'y suis arrivé aujourd'hui , j'ai cocher "Rendre l'assembly visible par COM", j'ai changé la valeur de GUID par "1C500ECD-EAC3-4ddd-9F34-AEC22AEF1AE9", j'ai ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    On Error Resume Next 
    Msgbox("Erreur onExtractIcon")
    et apres , grace à regAsm (la commande : regAsm /tlb maDll.dl, se qui crée un fichier .tlb de ton dll ainsi que l'enregistré dans le registre, cette fonction ne marchait pas avant les modifications énuméré ci-dessus)
    j'ai pu enfin généré un fichier .tlb, j'ai redémarré mon "Explorer.exe" et j'ai crié de jois, la droit devant mes yeux se trouvais se que j'esperais voir, une belle boite de text contenant "Erreur onExtractIcon" et ensuite les fichier Empty.customExtension et Full.customExtension changer pour les Icones spécifié !!!!
    JE VOUS REMERCI BEAUCOUP!!!!!

    Bon maintenant que ca marche pourrais tu m'aidé/expliquer comment je pourrais faire que je puisse changé l'icone d'un fichier spécifié par celle choisir par la function SHChangeIconDialogW (ICO, DLL, EXE , CPL...ect...)

    EDIT : Bon apres des petit tests dans le registre je constate que pour que ca marche il faut que je fasse aussi la commande "regasm /codebase maDLL.dll"

  16. #76
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Je crois peut-être qu'en trouvant un moyen d'ajouté une textbox invisible ou encore un onglet invisible avec une textbox dans les propriété des fichier dont l'icone est modifié (les flux méta-donné j'ai entendu dire), se textbox aurait la valeur exemple :" IconHandled" pour dire que se fichier à un IconHandling et sinon "IconNormal" ou encore simplement vide.

  17. #77
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Hum...
    Désolé de déterrer ce topic mais je viens de me souvenir de cet article:
    Do not write in-process shell extensions in managed code
    Et un IconHandler, c'est forcément in-process...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #78
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Oh , ton désolé n'est pas nécessaire, je suis plutot content de voir qu'il y'en a encore qui pense à mon topic puisque j'avais justement des problèmes.

    Bon je vous explique où j'en suis, ma library IconHandler.dll est motié fonctionnel, je suis capable de changé l'icone des fichiers mais tout les fichiers aillant un DefautlIcon (.exe,.jpg ,ect...) et dont l'icone n'est pas modifier devien avec une icone blanc, c'est à dire, impossible d'afficher son icone par défaut ,pareil pour les ".exe".

    Il y'a des problèmes d'actualisation fréquent (les icones ne se met pas toujours à jour), il faudrait pouvoir actualiser "Explorer.exe" sans le fermer.

    Sinon voila se que j'ai essayée pour le problème du DefaultIcon, j'ai modifié OnGetIconLocation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Public Overrides Function OnGetIconLocation(ByRef IconFile As String, ByRef IconIndex As Integer, ByVal Flags As Edanmo.ShellExtensions.IconHandlerFlags) As IconHandlerReturnFlags
                Dim FileInfo As New System.IO.FileInfo(Me.Filename)
                Dim getExt = FileInfo.Extension
                If (readStreamData(Me.Filename, "IconHandler", 2) Is Nothing) Then
                    If (getExt = ".exe") Then
                        IconFile = Me.Filename
                        IconIndex = 1
                    Else
     
     
                        If (Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue("") IsNot Nothing) Then
                            If (Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True) IsNot Nothing) Then
                                If (Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.Contains(",")) Then
                                    IconFile = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.Substring(0, Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.LastIndexOf(","))
                                    IconIndex = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.Substring(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.LastIndexOf("-") + 1)
                                    MsgBox(IconFile)
                                Else
                                    IconFile = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("")
                                    IconIndex = IconIndex
                                    MsgBox(IconFile)
                                End If
     
     
                            End If
     
     
                        Else
                            IconFile = IconFile
                            IconIndex = IconIndex
                        End If
     
                    End If
     
                End If
     
                Return IconHandlerReturnFlags.PerInstance Or IconHandlerReturnFlags.DontCache
     
            End Function

    Code Complet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    Option Explicit On
     
     
    Imports System
    Imports System.Drawing
    Imports Microsoft.VisualBasic
    Imports Edanmo.ShellExtensions
    Imports NTFSStreams.NtfsStream
    Imports FileZitorIC.c2i.IO.FileInfo
    Imports System.Runtime.InteropServices
     
    Namespace FileZitorIC
     
     
        < _
           ExtensionFileTypes(".customExtension"), _
           ComClass(IconHandlingClass.ClassId, IconHandlingClass.InterfaceId, IconHandlingClass.EventsId) _
        > _
        Public Class IconHandlingClass
            Inherits Edanmo.ShellExtensions.IconHandlerBase
     
            Private Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            Private Const HWND_BROADCAST = &HFFFF
            Private Const WM_SETTINGCHANGE = &H1A
     
     
            Private Declare Ansi Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoW" ( _
          ByVal pszPath As String, _
          ByVal dwFileAttributes As Integer, _
          ByRef psfi As c2i.IO.FileInfo.SHFILEINFO, _
          ByVal cbFileInfo As Integer, _
          ByVal uFlags As Integer) As Integer
     
            Public Const ClassId As String = "771B82BB-5A8C-43f0-B3E0-E3D25A1F7F95"
            Public Const InterfaceId As String = "F856C01B-36DE-4b7b-8EF4-2AE03CB90548"
            Public Const EventsId As String = "1C500ECD-EAC3-4ddd-9F34-AEC22AEF1AE9"
     
            Public Overrides Sub OnExtractIcon(ByVal Filename As String, ByVal IconIndex As Integer, ByRef LargeIcon As IntPtr, ByRef SmallIcon As IntPtr, ByVal LargeSize As Integer, ByVal SmallSize As Integer)
     
     
     
                Dim currentFileInfo As New System.IO.FileInfo(Me.Filename)
                Dim image As Image
                Dim Large, Small As Bitmap
                On Error Resume Next
     
     
                If (readStreamData(Me.Filename, "IconHandler", 2) IsNot Nothing) Then
     
                    image = readStreamData(Me.Filename, "IconHandler", 2) ' Image Contenu dans la stream
                    ' Create a large and small thumbnail
                    Small = DirectCast(image.GetThumbnailImage(SmallSize, SmallSize, Nothing, IntPtr.Zero), Bitmap)
                    Large = DirectCast(image.GetThumbnailImage(LargeSize, LargeSize, Nothing, IntPtr.Zero), Bitmap)
     
                    ' Convert the thumbnails to icons
                    LargeIcon = Large.GetHicon()
                    SmallIcon = Small.GetHicon()
     
                    Small.Dispose()
                    Large.Dispose()
                    image.Dispose()
                Else
     
     
                    Dim shfi As New SHFILEINFO
                    SHGetFileInfo(Me.Filename, FILE_ATTRIBUTE_NORMAL, shfi, Marshal.SizeOf(shfi), SHGFI_LARGEICON)
     
     
                    LargeIcon = shfi.hIcon
                    SHGetFileInfo(Me.Filename, FILE_ATTRIBUTE_NORMAL, shfi, Marshal.SizeOf(shfi), SHGFI_SMALLICON)
     
                    SmallIcon = shfi.hIcon
     
     
     
     
     
                End If
     
     
     
     
     
     
     
     
     
     
     
     
            End Sub
     
            Public Overrides Function OnGetIconLocation(ByRef IconFile As String, ByRef IconIndex As Integer, ByVal Flags As Edanmo.ShellExtensions.IconHandlerFlags) As IconHandlerReturnFlags
                Dim FileInfo As New System.IO.FileInfo(Me.Filename)
                Dim getExt = FileInfo.Extension
                If (readStreamData(Me.Filename, "IconHandler", 2) Is Nothing) Then
                    If (getExt = ".exe") Then
                        IconFile = Me.Filename
                        IconIndex = 1
                    Else
     
     
                        If (Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue("") IsNot Nothing) Then
                            If (Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True) IsNot Nothing) Then
                                If (Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.Contains(",")) Then
                                    IconFile = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.Substring(0, Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.LastIndexOf(","))
                                    IconIndex = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.Substring(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("").ToString.LastIndexOf("-") + 1)
                                    MsgBox(IconFile)
                                Else
                                    IconFile = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(getExt, True).GetValue(""), True).OpenSubKey("DefaultIcon", True).GetValue("")
                                    IconIndex = IconIndex
                                    MsgBox(IconFile)
                                End If
     
     
                            End If
     
     
                        Else
                            IconFile = IconFile
                            IconIndex = IconIndex
                        End If
     
                    End If
     
                End If
     
                Return IconHandlerReturnFlags.PerInstance Or IconHandlerReturnFlags.DontCache
     
            End Function
     
     
        End Class
    End Namespace


    J'espere avoir de l'aide, sinon médinoc, je suis pas sûr de comprend ton message, mon IconHandler pourrait dérangé le shell(pitié non...)?

  19. #79
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attends, tu n'as pas associé ton IconHandler avec un type de fichier particulier ? Tu l'actives pour tous ?

    PS: Ben oui, il peut perturber le shell, et il peut perturber des programmes en .Net qui utilisent le shell, etc.
    Mon IconHandler développé en C++ natif avec ATL ne risque pas de le perturber par contre, puisqu'il n'est pas en .Net.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #80
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 11
    Points
    11
    Par défaut
    Comme tu peux le voir j'ai laissé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    < _
           ExtensionFileTypes(".customExtension"), _
           ComClass(IconHandlingClass.ClassId, IconHandlingClass.InterfaceId, IconHandlingClass.EventsId) _
        > _
    sans y changé rien puisque j'ajout les clé registre nécessaire avec mon programme,
    exemple, disont que je je veux changé l'icone d'un fichier exe, bah mon programme va créé ClassRoot\exefile\shellex\IconHandler @="{771B82BB-5A8C-43f0-B3E0-E3D25A1F7F95}", ca marche.

    et grace à ExtractIconEx, je suis capable d'afficher la bonne icone par défaut pour les fichiers exe , juste un problème, l'icone des fichiers "exe" dans les dossiers ont un légé flou.

    Médinoc, j'aimerais savoir quel genre de problème, parce que mon programme en .Net n'a pas l'air très perturbé par mon IconHandler.

Discussions similaires

  1. [XL-2003] Changer icone d'un fichier excel
    Par toinou28 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/05/2009, 13h35
  2. Changer l'icone d'UN fichier excel
    Par Speed41 dans le forum Excel
    Réponses: 7
    Dernier message: 26/03/2009, 10h58
  3. [HTML] changer d'icone pour un fichier HTML
    Par Cuenod dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 22/02/2008, 23h05
  4. Changer l'icone d'un fichier compilé (exe)
    Par pitizone dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/04/2007, 09h54
  5. [VB6] Changer l'icone d'un fichier
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 33
    Dernier message: 12/05/2006, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo