看起来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_RENAMEFOLDER
,SHCNE_RENAMEITEM
,SHCNE_UPDATEDIR
,SHCNE_UPDATEITEM
)。
(最糟糕的方法可能是编辑desktop.ini
两次......直接一次,然后使用该API函数......而不是我想要的。)
关于为什么(我猜至少有一个人会问):
我使用GUID存储项目数据作为文件夹名称。
然而,用户应该看到一个友好的名称,也可以用于排序(甚至可以编辑它而不会干扰内部名称)。 此外,低级文件系统布局应该与旧版本的软件向后兼容。
答案 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函数失败。