0

在阅读了很多内容并连续尝试了 2 天之后,我设法按照 Microsoft 关于文件夹图标的教程完成了一些工作,但这并不完美 - 更改不会立即发生。我需要重新启动资源管理器/重新启动计算机或等待几分钟(随机),直到我看到旧图标变为新图标。

TL;博士

预期结果:我想以编程方式更新我的文件夹图标,并看到新图标立即出现,无需等待。(使用c++,.batnode.js任何其他可行的方法,我真的不介意)。

问题:链接我的.ico文件后,我希望立即看到结果,但我只能在 30 秒到 4 分钟左右后看到它。它有时也会立即发生变化,但很少发生,我希望它 100% 的时间都能正常工作。

要求和注意事项:

  • 不能重新启动资源管理器。
  • 如果它不会从所有文件夹和文件中清除整个缩略图缓存会更好,因为它只需要更新单个文件夹图标。

希望/失败的尝试

以编程方式重命名desktop.ini(不幸的是不工作)

我找到了一种立即查看图标更改的方法,但它仅在通过资源管理器本身手动重命名 desktop.ini 时才有效。(将 desktop.ini 更改为大写/小写或 desktop-temp.ini,然后返回 desktop.ini)这样做时,我看到文件夹图标立即更改。

这使我希望我可以以编程方式执行相同的操作,因此我尝试了此 C++ 代码,该代码更改desktop.inidesktop-temp.ini并返回desktop.ini,还通知窗口发生了更改,但不幸的是它没有工作。

#include <stdio.h>
#include <Windows.h>
#include <winbase.h>
#include <Tchar.h>
#include <shlobj.h> // for SHGetSpecialFolderPathA


const char folderpath[] = "C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon";

int main()
{
    // rename("C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\desktop.ini", "desktop-temp.ini");

    if (MoveFile(_T("C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\desktop.ini"), _T("desktop-temp.ini")))
    {
        printf("succeeded\n");
    }
    else
    {
        printf("Error %d\n", GetLastError());
    }

    SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_NOTIFYRECURSIVE, NULL, NULL);
    SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_NOTIFYRECURSIVE, folderpath, NULL);

    if (MoveFile(_T("C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\desktop-temp.ini"), _T("desktop.ini")))
    {
        printf("succeeded\n");
    }
    else
    {
        printf("Error %d\n", GetLastError());
    }

    SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_NOTIFYRECURSIVE, NULL, NULL);
    SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_NOTIFYRECURSIVE, folderpath, NULL);
}

SHChangeNotify()(有效,但不是立即)

灵感来源:如何在 Windows 中即时刷新文件夹图标

我尝试运行这个 C++ 代码(在使用 npm 命令编译之后g++ -o refresh-folder-icons refresh-folder-icons.cpp)并且它成功了!但我的变化发生在 1 到 5 分钟之间,如果你幸运的话,你会立即看到它。这是不可靠的。我在两台计算机(均为 Windows 10)上对此进行了测试。

#include <windows.h>
#include <ShlObj.h>

const char folderPath[] = "path/to/folder";

int main()
{
    SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, folderPath, NULL);
    SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_NOTIFYRECURSIVE, "path/to/folder/desktop.ini", NULL);
}

使用 VBScript “使用 shell 函数通知所有正在运行的资源管理器窗口使用更新的 desktop.ini”(对我不起作用)

我也尝试过创建一个.bat文件,然后是:更改 desktop.ini 不会在 Windows 中自动更新文件夹图标,但我的文件夹仍然显示以前的图标。

使用 IE4UINIT 刷新图标

按照此

运行以下命令(对于 Windows 10)并按 Enter:ie4uinit.exe -show 对于 Windows 8 及更早版本,请改为运行此命令:ie4uinit.exe -ClearIconCache

使用NirCmd刷新图标

按照本教程(第 3 步),我尝试安装NirCmd并运行所有三个,它们都没有刷新我的文件夹图标:

nircmd.exe sysrefresh 

nircmd.exe sysrefresh environment 

nircmd.exe sysrefresh policy

SHGetSetFolderCustomSettings()(我的主要希望!!!)

有人在这里写道SHGetSetFolderCustomSettings功能设置一个图标并自行发送所有必要的通知”,这真的让我希望这是正确的道路。

此外,在 Peter Tseng 的回答herehere中,他展示了一个有效的示例代码,但是当我尝试将此 C++ 代码编译成.exe时,我得到了错误。这是代码:

#include <windows.h>
#include <shlobj.h>

int main()
{
    SHFOLDERCUSTOMSETTINGS pfcs;
    pfcs.dwMask = "C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\folderico-1629960936.ico";
    pfcs.pszIconFile = "C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\folderico-1629960936.ico";
    pfcs.cchIconFile = 0;
    pfcs.iIconIndex = 0;
    PCWSTR pszPath = L"C:\\Users\\elron\\Elron Apps C\\005 Folder Icon\\paste-folder-icon\\test\\hey";
    SHGetSetFolderCustomSettings(pfcs, pszPath, FCS_FORCEWRITE);
}

但我得到三个错误,都表明同一个问题:

  • 'SHFOLDERCUSTOMSETTINGS'未在此范围内声明 (gcc)
  • 'pfcs'未在此范围内声明 (gcc)
  • 'SHGetSetFolderCustomSettings'未在此范围内声明 (gcc)

为什么我会收到此错误?我缺少依赖项吗?我正在使用 Windows 10。


4

0 回答 0