0

看起来SHGetSetFolderCustomSettings允许您设置图标、工具提示、Web 视图模板和其他内容,但我找不到如何LocalizedResourceName在关联中进行设置desktop.ini(请参阅SHFOLDERCUSTOMSETTINGS 结构)。

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

这就是我想使用 Python编写的内容(尽管非 Python 代码应该不成问题):

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

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

我试过用SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_PATH, path, path),但这似乎并没有更新显示名称(也用SHCNE_RENAMEFOLDER, SHCNE_RENAMEITEM, SHCNE_UPDATEDIR, SHCNE_UPDATEITEM)。

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

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

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

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

4

1 回答 1

1

Use simple call of 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;

UPDATE

Important notice! LocalizedResourceName parameter must exists in desktop.ini before you call UpdateLocalizedResourceName. Otherwise SetNameOf function fails.

于 2014-11-28T19:37:25.667 回答