在阅读了很多内容并连续尝试了 2 天之后,我设法按照 Microsoft 关于文件夹图标的教程完成了一些工作,但这并不完美 - 更改不会立即发生。我需要重新启动资源管理器/重新启动计算机或等待几分钟(随机),直到我看到旧图标变为新图标。
TL;博士
预期结果:我想以编程方式更新我的文件夹图标,并看到新图标立即出现,无需等待。(使用c++
,.bat
或node.js
任何其他可行的方法,我真的不介意)。
问题:链接我的.ico
文件后,我希望立即看到结果,但我只能在 30 秒到 4 分钟左右后看到它。它有时也会立即发生变化,但很少发生,我希望它 100% 的时间都能正常工作。
要求和注意事项:
- 它不能重新启动资源管理器。
- 如果它不会从所有文件夹和文件中清除整个缩略图缓存会更好,因为它只需要更新单个文件夹图标。
希望/失败的尝试
以编程方式重命名desktop.ini
(不幸的是不工作)
我找到了一种立即查看图标更改的方法,但它仅在通过资源管理器本身手动重命名 desktop.ini 时才有效。(将 desktop.ini 更改为大写/小写或 desktop-temp.ini,然后返回 desktop.ini)这样做时,我看到文件夹图标立即更改。
这使我希望我可以以编程方式执行相同的操作,因此我尝试了此 C++ 代码,该代码更改desktop.ini
为desktop-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()
(有效,但不是立即)
我尝试运行这个 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 的回答here和here中,他展示了一个有效的示例代码,但是当我尝试将此 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。