【问题标题】:How to set folder display name with e.g. "SHGetSetFolderCustomSettings()"?如何使用例如设置文件夹显示名称“SHGetSetFolderCustomSettings()”?
【发布时间】:2014-11-28 14:38:08
【问题描述】:

看起来SHGetSetFolderCustomSettings 允许您设置图标、工具提示、Web 视图模板等,但我找不到如何在关联的desktop.ini 中设置LocalizedResourceName(请参阅SHFOLDERCUSTOMSETTINGS structure)。

因此,我目前正在直接写信给desktop.ini,但这有一个警告: 即使您告诉它使用 F5Ctrl+R 刷新,Explorer 也不会正确更新其视图。

这就是我想写的,使用 Python(虽然非 Python 代码应该问题不大):

[.ShellClassInfo]
LocalizedResourceName=My Folder Name
InfoTip=A customized folder

任何想法如何设置文件夹名称并让资源管理器正确更新它?

我尝试过使用SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_PATH, path, path),但这似乎并没有更新显示名称(还有SHCNE_RENAMEFOLDERSHCNE_RENAMEITEMSHCNE_UPDATEDIRSHCNE_UPDATEITEM)。

(最糟糕的方法可能是编辑desktop.ini 两次...一次直接,然后使用该 API 函数...而不是我想要的)。

关于原因(我猜你们中至少有人会问):

我使用 GUID 作为文件夹名称来存储项目数据。

但是,用户应该会看到一个友好的名称,该名称也可用于排序(甚至可以在不影响内部名称的情况下对其进行编辑)。 此外,低级文件系统布局应该向后兼容旧版本的软件。

【问题讨论】:

    标签: windows python-3.x explorer desktop-integration


    【解决方案1】:

    使用 IShellFolder.SetNameOf 的简单调用:

    procedure UpdateLocalizedResourceName(const ADirectory, ANewResourceName: UnicodeString);
    var
      Desktop: IShellFolder;
      Eaten: DWORD;
      DirIDList1, Child, NewChild: PItemIDList;
      Attr: DWORD;
      Folder: IShellFolder;
    begin
      OleCheck(SHGetDesktopFolder(Desktop));
      try
        Attr := 0;
        OleCheck(Desktop.ParseDisplayName(0, nil, PWideChar(ADirectory), Eaten, DirIDList1, Attr));
        try
          OleCheck(SHBindToParent(DirIDList1, IShellFolder, Pointer(Folder), Child));
          try
            OleCheck(Folder.SetNameOf(0, Child, PWideChar(ANewResourceName), SHGDN_INFOLDER, NewChild));
            CoTaskMemFree(NewChild);
          finally
            Folder := nil;
          end;
        finally
          CoTaskMemFree(DirIDList1);
        end;
      finally
        Desktop := nil;
      end;
    end;
    

    更新

    重要通知!在调用 UpdateLocalizedResourceName 之前,localizedResourceName 参数必须存在于 desktop.ini 中。否则 SetNameOf 函数失败。

    【讨论】:

    • 嗯,看起来比我希望的要复杂...我还想设置一个信息提示,所以我必须使用desktop.ini处理、IShellFolder.SetNameOf()和/或的组合SHGetSetFolderCustomSettings(),还是有更有效的方法来实现我的目标?对于更多的上下文:我正在开发一个与 Windows API 接口的 Python 解决方案,所以一切皆有可能,但比 Windows 语言更麻烦。
    • @Archimedix 据我了解,您必须使用 SHGetSetFolderCustomSettings 和 IShellFolder.SetNameOf 的组合。
    • SHSetLocalizsedName 一次性完成。
    • @RaymondChen,我如何调用SHSetLocalizedName() 来设置任意字符串?文档说它是使用应该设置显示名称的路径、具有本地化字符串和资源 ID 的资源文件来调用的。根据文档,该函数还将文本持久化在注册表中,而不是desktop.ini,这有点令人困惑。
    • 貌似SHSetLocalizedName() 不支持任意字符串,只支持引用DLL等资源文件。
    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多