You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过C++修改desktop.ini更新文件夹图标如何立即生效无需重启资源管理器

编译报错问题解决方案

你使用GCC编译时找不到SHFOLDERCUSTOMSETTINGS等定义的原因有两个:

  1. 缺少版本宏定义和对应头文件:该API是Windows Vista及以上版本才支持的,GCC默认不会暴露高版本Windows API声明,需要在引入系统头文件前添加宏定义,额外引入shobjidl.h。
  2. 你的示例代码本身存在参数错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:18:01