gpt4 book ai didi

c - 如何告诉 Windows 资源管理器刷新其图标?

转载 作者:行者123 更新时间:2023-12-02 02:35:58 28 4
gpt4 key购买 nike

一旦我的安装程序完成安装我的应用程序 exe 的新版本,我想告诉资源管理器使用新 exe 的图标作为其快捷方式。但是,我无法弄清楚如何做到这一点。

从网上看,问题是system image list正在缓存旧版本的图标。我试着打电话 SHChangeNotifySHCNE_UPDATEIMAGE范围。我试着打电话 SHUpdateImage .我什至尝试了 sledgehammer approach广播WM_SETTINGCHANGE .似乎没有任何效果。

我完全有可能只是做错了什么。任何帮助,将不胜感激。

警告:非常丑陋的测试代码如下。

#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, &reg, 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

最佳答案

你的大锤方法是我见过的用来完成这项工作的方法。但是,在您的代码中,“ shell 图标大小”值是 REG_SZ ,不是 REG_DWORD .始终 VERIFY() API 函数返回值...

关于c - 如何告诉 Windows 资源管理器刷新其图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757737/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com