从How to rebuild Windows Icon Cache without closing explorer.exe or restarting Windows?开始,我需要知道我是否正确使用SHChangeNotify
功能。
简而言之,我的要求是创建一个desktop.ini
文件并将其添加到我的应用程序的文件夹中,desktop.ini
文件用于让Windows知道该文件夹将使用自定义文件夹图标,问题是文件夹似乎没有更新,并在几乎立即更新时显示新图标。
desktop.ini
创建非常简单:
procedure TMainForm.MakeDesktopIni(FolderPath, IconPath: string);
var
IniFile: TIniFile;
Section: string;
begin
IniFile := TIniFile.Create(IncludeTrailingBackslash(FolderPath) + 'desktop.ini');
try
Section := '.ShellClassInfo';
IniFile.WriteInteger(Section, 'ConfirmFileOp', 0);
IniFile.WriteInteger(Section, 'NoSharing', 1);
IniFile.WriteString(Section, 'IconFile', IconPath);
IniFile.WriteInteger(Section, 'IconIndex', 0);
finally
IniFile.Free;
end;
end;
从上面发布的链接开始,文件夹图标肯定已经更改,因为查看文件夹属性会显示新图标,但是从资源管理器中它不会更新以反映这一点,至少在重新启动资源管理器之前不会更新。
我现在已经在Lazarus和Delphi中试过以下但没有成功:
procedure RefreshFolderIcons(Folder: string);
begin
{$IFDEF FPC}
ShlObj.SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, PChar(Folder), nil);
{$ELSE}
Winapi.ShlObj.SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, PChar(Folder), nil);
{$ENDIF}
end;
如果确实这是我需要调用的正确Windows功能,我无法理解为什么我无法从我的应用程序中使用它?