首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用desktop.ini更新文件夹图标&立即更改(C++)

用desktop.ini更新文件夹图标&立即更改(C++)
EN

Stack Overflow用户
提问于 2021-08-26 15:07:27
回答 1查看 813关注 0票数 1

在连续两天的阅读和尝试之后,我成功地使一些东西在通过遵循此Microsoft教程中的文件夹图标上发挥作用,但这并不完美--更改不会立即发生。我需要重新启动资源管理器/重新启动我的计算机,或者等待几分钟(随机),直到我看到旧图标更改为新图标。

TL;DR

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

问题:在链接了我的.ico文件之后,我希望能够一目了然地看到结果,但我只在30秒到4分左右之后才看到它。它有时也会立即改变,但很少,我希望它能100%地发挥作用。

要求和注意事项:

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

希望/未实现的尝试

以编程方式重命名desktop.ini (不幸不起作用)

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

这让我产生了这样的希望:我可以以编程的方式做同样的事情,所以我尝试了这个C++代码,它将desktop.ini更改为desktop-temp.ini,然后返回到desktop.ini,并通知窗口发生了更改,但不幸的是,它没有工作。

代码语言:javascript
运行
复制
#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)上测试了这一点。

代码语言:javascript
运行
复制
#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并全部运行,没有一个刷新我的文件夹图标:

代码语言:javascript
运行
复制
nircmd.exe sysrefresh 

nircmd.exe sysrefresh environment 

nircmd.exe sysrefresh policy

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

有人在这里写道表示,SHGetSetFolderCustomSettings“函数设置了一个图标,并自行发送了所有必要的通知”,这确实让我希望这是正确的路径。

另外,在Peter的S答案这里这里中,他展示了一个可以工作的示例代码,但是当我试图将这个C++代码复杂化为.exe时,我会得到错误。这是代码:

代码语言:javascript
运行
复制
#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.

EN

回答 1

Stack Overflow用户

发布于 2022-08-16 23:53:06

我设法使用了最后一种方法(使用SHGetSetFolderCustomSettings())

代码语言:javascript
运行
复制
#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++的新手,所以如果这不是问题的根源,请随时纠正我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68941080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档