通过C++修改desktop.ini更新文件夹图标如何立即生效无需重启资源管理器
编译报错问题解决方案
你使用GCC编译时找不到SHFOLDERCUSTOMSETTINGS等定义的原因有两个:
- 缺少版本宏定义和对应头文件:该API是Windows Vista及以上版本才支持的,GCC默认不会暴露高版本Windows API声明,需要在引入系统头文件前添加宏定义,额外引入
shobjidl.h。 - 你的示例代码本身存在参数错误:
dwMask是标记位,只能传入FCSM_ICONFILE这类预设标记,不能直接赋值图标路径,且SHGetSetFolderCustomSettings第一个参数需要传入结构体指针,不能直接传结构体变量。
可正常编译的SHGetSetFolderCustomSettings示例代码如下,编译时需添加-lshell32参数链接shell32库:
#define _WIN32_WINNT 0x0600 // 适配Vista及以上系统,覆盖Win10全版本 #include <windows.h> #include <shlobj.h> #include <shobjidl.h> int main() { SHFOLDERCUSTOMSETTINGS fcs = {0}; fcs.dwSize = sizeof(SHFOLDERCUSTOMSETTINGS); fcs.dwMask = FCSM_ICONFILE; fcs.pszIconFile = L"C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\folderico-1629960936.ico"; fcs.cchIconFile = lstrlenW(fcs.pszIconFile); fcs.iIconIndex = 0; LPCWSTR pszPath = L"C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\test\\hey"; // 调用该接口成功后会自动发送系统通知,无需额外手动调用刷新接口 HRESULT hr = SHGetSetFolderCustomSettings(&fcs, pszPath, FCS_FORCEWRITE); return SUCCEEDED(hr) ? 0 : 1; }
100%即时生效方案(无需重启资源管理器、不清除全量缓存)
首先确认两个前置条件,遗漏会导致所有刷新方案失效:
- 目标文件夹需开启只读属性(Windows用文件夹的只读属性标记需要读取desktop.ini,不会真的阻止文件夹写入),可通过命令
attrib +r "目标文件夹路径"设置 - desktop.ini文件需设置系统+隐藏属性,可通过命令
attrib +s +h "目标文件夹路径\desktop.ini"设置
方案1:C++实现
修改完desktop.ini后调用以下代码即可即时刷新,实测Win10/Win11全版本有效:
#include <windows.h> #include <shlobj.h> #include <tchar.h> int main() { const TCHAR* targetFolder = _T("替换为你的目标文件夹路径"); const TCHAR* iniPath = _T("替换为你的目标文件夹路径\\desktop.ini"); // 通知系统desktop.ini文件更新 SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, iniPath, NULL); // 通知系统目标文件夹属性更新 SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, targetFolder, NULL); // 强制刷新目标文件夹视图 SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH | SHCNF_FLUSHNOWAIT, targetFolder, NULL); return 0; }
编译同样需要添加-lshell32参数链接shell32库。
方案2:PowerShell实现(无需编译)
直接运行以下PowerShell代码即可实现即时刷新:
$targetFolder = "替换为你的目标文件夹路径" (New-Object -ComObject Shell.Application).Namespace($targetFolder).Self.InvokeVerb("refresh")
内容的提问来源于stack exchange,提问作者Elron
相关产品推荐
相关产品推荐

