Une fois que mon installateur aura fini d'installer de nouvelles versions de l'exe de mon application, j'aimerais dire à Explorer d'utiliser les icônes du nouvel exe pour ses raccourcis. Cependant, je ne peux pas comprendre comment faire cela. De la lecture en ligne, le problème est que le system image list met en cache une ancienne version de l'icône. J'ai essayé d'appeler SHChangeNotify avec un paramètre SHCNE_UPDATEIMAGE
. J'ai essayé d'appeler SHUpdateImage. J'ai même essayé le sledgehammer approach de la diffusion WM_SETTINGCHANGE
. Rien ne semble fonctionner.Comment indiquer à Windows Explorer d'actualiser ses icônes?
Il est tout à fait possible que je fasse quelque chose de mal. Toute aide serait appréciée.
Avertissement: Un code de test très moche suit.
#if 1
// First attempt: using shell functions
wchar_t icon_path[MAX_PATH];
int icon_index;
UINT icon_flags;
IShellFolder *desktop_folder;
IShellFolder *sub_folder;
IExtractIcon *extract_icon;
LPITEMIDLIST pidl;
SHGetDesktopFolder(&desktop_folder);
wchar_t *folder_path = L"C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\MyCompany\\";
desktop_folder->ParseDisplayName(NULL, NULL, folder_path, NULL, &pidl,
NULL);
desktop_folder->BindToObject(pidl, NULL, IID_IShellFolder,
(void**) &sub_folder);
sub_folder->ParseDisplayName(NULL, NULL, L"MyApp.lnk", NULL, &pidl,
NULL);
sub_folder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*) &pidl,
IID_IExtractIcon, NULL, (void**) &extract_icon);
extract_icon->GetIconLocation(0, icon_path, MAX_PATH,
&icon_index, &icon_flags);
SHFILEINFO sfi;
DWORD_PTR result = SHGetFileInfo(shortcut_path, 0, &sfi, sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
SHUpdateImage(icon_path, icon_index, icon_flags, sfi.iIcon);
// sfi.iIcon should be correct, but we'll try both, just for fun...
SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, NULL,
(LPCVOID) icon_index);
SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, NULL,
(LPCVOID) sfi.iIcon);
#else
// Second attempt: broadcasting a settings change
HKEY reg;
RegCreateKeyEx(HKEY_CURRENT_USER,
L"Control Panel\\Desktop\\WindowMetrics", 0, NULL, 0,
KEY_SET_VALUE, NULL, ®, NULL);
DWORD value;
value = 33;
RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value,
sizeof(value));
value = 32;
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS,
(int) L"WindowMetrics");
RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value,
sizeof(value));
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS,
(int) L"WindowMetrics");
#endif
Avez-vous essayé de simplement demander gentiment? (Désolé, ne pouvait pas l'aider.;) –
@Dustin: Laissez-moi essayer. Démarrer -> Exécuter -> "explorer --refresh-my-icons-please". Réponses de l'explorateur: "Le chemin '--refresh-my-icons-please' n'existe pas ou n'est pas un répertoire." Non, n'a pas fonctionné. –