我如何知道我是否正确处理SHChangeNotify函数?

时间:2016-01-15 19:31:22

标签: winapi

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功能,我无法理解为什么我无法从我的应用程序中使用它?

0 个答案:

没有答案