在连续两天的阅读和尝试之后,我成功地使一些东西在通过遵循此Microsoft教程中的文件夹图标上发挥作用,但这并不完美--更改不会立即发生。我需要重新启动资源管理器/重新启动我的计算机,或者等待几分钟(随机),直到我看到旧图标更改为新图标。
TL;DR
预期结果:我想以编程方式更新我的文件夹图标,并看到新图标立即出现,而无需等待。(使用c++
、.bat
、node.js
或其他有用的东西,我真的不介意)。
问题:在链接了我的.ico
文件之后,我希望能够一目了然地看到结果,但我只在30秒到4分左右之后才看到它。它有时也会立即改变,但很少,我希望它能100%地发挥作用。
要求和注意事项:
希望/未实现的尝试
以编程方式重命名desktop.ini
(不幸不起作用)
我找到了一种看到图标立即改变的方法,即通过资源管理器本身看到但是它只在手动重命名desktop.ini时才起作用。。(将desktop.ini更改为大写/小写或桌面-tem.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()
(工作,但不是一成不变的)
灵感来源:如何在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);
}
“使用一个shell函数,它将通知所有运行中的资源管理器窗口使用更新的desktop.ini”使用VBScript (对我不起作用)
我还尝试创建一个.bat
文件,后面跟着这个:更改desktop.ini不会自动更新Windows中的文件夹图标,但是我的文件夹仍然显示了前面的图标。
使用IE4UINIT刷新图标
运行以下命令(对于Windows 10)并按Enter:ie4uinit.exe -show
For Windows 8及更早版本,然后运行以下命令:ie4uinit.exe -ClearIconCache
使用NirCmd刷新图标
遵循本教程(步骤3),我试着安装NirCmd并全部运行,没有一个刷新我的文件夹图标:
nircmd.exe sysrefresh
nircmd.exe sysrefresh environment
nircmd.exe sysrefresh policy
SHGetSetFolderCustomSettings()
(我的主要希望!)
有人在这里写道表示,SHGetSetFolderCustomSettings
“函数设置了一个图标,并自行发送了所有必要的通知”,这确实让我希望这是正确的路径。
另外,在Peter的S答案这里和这里中,他展示了一个可以工作的示例代码,但是当我试图将这个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.
发布于 2022-08-16 23:53:06
我设法使用了最后一种方法(使用SHGetSetFolderCustomSettings()
)
#include <windows.h>
#include <shlobj.h>
int main()
{
/*
convert the icon's path to LPWSTR, as required by field pszIconFile
method taken from https://stackoverflow.com/questions/29847036/convert-char-to-wchar-t-using-mbstowcs-s
*/
const char* iconPath = "C:\\Users\\YourUsername\\PathTo\\YourIcon\\file.ico";
size_t size = strlen(iconPath) + 1;
wchar_t* wtext = new wchar_t[size];
size_t outSize;
mbstowcs_s(&outSize, wtext, size, iconPath, size - 1);
LPWSTR ptr = wtext;
// (fixed the initialization of some fields)
SHFOLDERCUSTOMSETTINGS pfcs{};
pfcs.dwSize = sizeof(SHFOLDERCUSTOMSETTINGS);
pfcs.dwMask = FCSM_ICONFILE;
pfcs.pszIconFile = ptr;
pfcs.cchIconFile = 0;
pfcs.iIconIndex = 0;
PCWSTR pszPath = L"C:\\Users\\YourUsername\\PathTo\\YourFolder\\FolderToCustomize";
SHGetSetFolderCustomSettings(&pfcs, pszPath, FCS_FORCEWRITE);
}
我认为你提到的问题:
但是我得到了三个错误,所有的错误都指向了同一个问题:
'SHFOLDERCUSTOMSETTINGS'
(gcc)可能是因为您没有使用适当的编译器。当直接从控制台/在Visual代码上使用g++
时,我得到了类似的编译错误,但在使用Visual 2022 (VisualC++编译器)时,相同的代码也能工作。我也是C++的新手,所以如果这不是问题的根源,请随时纠正我。
https://stackoverflow.com/questions/68941080
复制相似问题