如何设置文件夹显示名称,例如“SHGetSetFolderCustomSettings()”?

时间:2014-11-28 14:38:09

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

看起来SHGetSetFolderCustomSettings允许您设置图标,工具提示,网页视图模板和内容,但我找不到如何在关联的LocalizedResourceName中设置desktop.ini(见SHFOLDERCUSTOMSETTINGS structure)。

因此我目前正在直接写信desktop.ini,但这有一个警告: 即使您使用 F5 Ctrl + R 进行刷新,资源管理器也无法正确更新其视图。

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

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

如何设置文件夹名称并让Explorer正确更新它?

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

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

关于为什么(我猜至少有一个人会问):

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

然而,用户应该看到一个友好的名称,也可以用于排序(甚至可以编辑它而不会干扰内部名称)。 此外,低级文件系统布局应该与旧版本的软件向后兼容。

1 个答案:

答案 0 :(得分: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函数失败。