2009-03-15 3 views
19

J'ai une extension de shell Windows qui utilise l'interface IShellIconOverlayIdentifier pour afficher les icônes de superposition sur les fichiers et les dossiers. Mon extension est un peu comme TortoiseCVS ou TortoiseSVN.Comment puis-je actualiser par programme Windows Explorer?

Parfois, j'ai besoin de faire redessiner toutes les icônes de Windows Explorer. Pour ce faire, je l'appelle SHChangeNotify comme ceci:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL) 

Actualise le volet de bureau et de la main droite de toutes les fenêtres de l'explorateur ouvert. Il n'actualise pas l'arborescence de dossiers sur le côté gauche des fenêtres de l'Explorateur.

J'essayé d'envoyer WM_SETTINGCHANGE comme ceci:

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 

sur Vista Actualise l'arborescence des dossiers, mais pas le volet de droite.

La combinaison de SHChangeNotify() suivie de WM_SETTINGCHANGE semble fonctionner assez bien sur Vista. Mais je ne peux toujours pas actualiser l'arborescence de dossiers sur XP s'il est affiché.

Est-ce que quelqu'un a des idées pour mieux faire?

Existe-t-il une meilleure solution pour XP?

L'envoi SHCNE_ASSOCCHANGED est un peu comme un explorateur clubbing sur la tête. Il provoque le rafraîchissement de l'ensemble du bureau assez violemment et ouvre toutes les fenêtres ouvertes de l'Explorateur pour y perdre sa position de défilement. Y a-t-il quelque chose d'un peu moins violent?

+0

TweakUI for XP dispose d'une option de "réparation de cache d'icônes". Vous pourrez peut-être utiliser SPY ++ pour voir ce qu'il fait. –

+1

HughE! Avez-vous pu résoudre votre problème? – A9S6

Répondre

7

Est-ce que quelqu'un a des idées comment faire mieux?

Personnellement, je ne sais pas. Vous mentionnez les programmes tortue qui font la même chose, donc un excellent point de départ serait de jeter un oeil à ce qu'ils font dans la source :)

Ceux-ci semblent être les fichiers sources pertinentes qui gèrent ce problème:

Je note dans la méthode RebuildIcons dans chacun de ces seront:

  1. définir la taille de l'icône de la coquille ou la profondeur de couleur à une valeur temporaire
  2. mises à jour toutes les fenêtres en diffusant le changement de réglage
  3. remet à zéro la taille de l'icône de la coquille ou la profondeur de couleur à la valeur d'origine
  4. mises à jour toutes les fenêtres une deuxième fois avec une diffusion du changement de réglage

Peut-être que cela fait partie de l'astuce pour faire fonctionner les choses dans XP.

+1

Il est regrettable qu'il n'y ait pas de meilleur moyen. J'espère que nous ne le faisons pas souvent! –

+0

Merci pour votre aide Simon. – HughE

+0

@jeffamaphone nous ne le faisons pas trop souvent. Quelques fois par jour la plupart du temps. – HughE

0

Utilisez espion ++ pour voir ce WM_COMMMAND message est envoyé lorsque vous appuyez sur F5 dans l'Explorateur Windows ou de trouver quel est le message menu est utilisé pour une vue/rafraîchir

Ensuite, utilisez FindWindow pour obtenir la fenêtre de l'explorateur que vous voulez et envoyer le WM_COMMAND enregistré message plus tôt etc.

C'est une façon amusante de contrôler toutes sortes de programmes Windows.

+0

J'ai essayé mais ça n'a rien montré d'utile. Il semble supprimer tous les éléments, puis les ajouter à nouveau tous. Il n'est certainement pas nécessaire d'aller à ces longueurs mais parce que cela * * * "rafraîchit" si vous changez simplement le mode d'affichage en quelque chose d'autre et en arrière. ': - |' – Synetech

+0

Utiliser Spy ++ pour traquer et essayer ces changements, bien que techniquement possible, est un vrai PITA. Vous pourriez perdre beaucoup de temps si vous n'êtes pas déjà habitué à utiliser l'outil. –

0

Vous pouvez également envoyer un message WM_KEYDOWN avec le code clé F5 à toutes les fenêtres de l'explorateur ouvertes. C'est un peu un hack cependant.

+1

Le moyen le plus simple n'est pas le meilleur moyen dans ce cas. – Idan

Questions connexes