【问题标题】:Clean Windows Thumbnail Cache Programmatically以编程方式清理 Windows 缩略图缓存
【发布时间】:2014-05-15 11:40:26
【问题描述】:

我正在编写一个为 Windows 文件夹创建缩略图图标的程序。我想为用户提供一种简单的方法来刷新他们的缩略图缓存。

是否可以通过任何 Windows API 来做到这一点?理想情况下在 C# 中,但更有可能通过包装一些 C++。

如果没有,是否有一种经过批准的方法来确定用户缩略图缓存的位置并手动删除它们。还是最好只启动cleanmgr 并让用户从那里执行?

【问题讨论】:

    标签: c# c++ windows winapi


    【解决方案1】:

    您可以为 Window 缩略图清理器扩展创建一个主机,该扩展将模拟 cleanmgr 工具。

    type
      TThumbnailCleanerCallBack = class(TInterfacedObject, IEmptyVolumeCacheCallBack)
      private
        function ScanProgress(dwlSpaceUsed: UInt64; dwFlags: DWORD; pcwszStatus: LPCWSTR): HRESULT; stdcall;
        function PurgeProgress(dwlSpaceFreed, dwlSpaceToFree: UInt64; dwFlags: DWORD; pcwszStatus: LPCWSTR): HRESULT; stdcall;
      end;
    
    function TThumbnailCleanerCallBack.ScanProgress(dwlSpaceUsed: UInt64; dwFlags: DWORD; pcwszStatus: LPCWSTR): HRESULT;
    begin
      Result := S_OK;
    end;
    
    function TThumbnailCleanerCallBack.PurgeProgress(dwlSpaceFreed, dwlSpaceToFree: UInt64; dwFlags: DWORD; pcwszStatus: LPCWSTR): HRESULT;
    begin
      Result := S_OK;
    end;
    
    procedure CleanThumbnailCache;
    const
      ThumbnailCleanerCLSID: TGUID = '{889900c3-59f3-4c2f-ae21-a409ea01e605}';
    var
      Drives: DWORD;
      Drive: DWORD;
      Letter: Char;
      ThumbnailCleaner: IEmptyVolumeCache;
      Key: HKEY;
      DisplayName: PWideChar;
      Description: PWideChar;
      Flags: DWORD;
      ThumbnailCleanerCallBack: TThumbnailCleanerCallBack;
    begin
      Drives := GetLogicalDrives;
      Drive := 1;
      for Letter := 'A' to 'Z' do
        begin
          if Drives and Drive <> 0 then
            begin
              OleCheck(CoCreateInstance(ThumbnailCleanerCLSID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, ThumbnailCleaner));
              try
                RegOpenKeyEx(HKEY_LOCAL_MACHINE, PWideChar('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Thumbnail Cache'), 0, KEY_READ, Key);
                try
                  DisplayName := nil;
                  Description := nil;
                  Flags := EVCF_SETTINGSMODE;
                  OleCheck(ThumbnailCleaner.Initialize(Key, PWideChar(Letter + ':\'), DisplayName, Description, Flags));
                  try
                    if Assigned(DisplayName) then CoTaskMemFree(DisplayName);
                    if Assigned(Description) then CoTaskMemFree(Description);
                    ThumbnailCleanerCallBack := TThumbnailCleanerCallBack.Create;
                    OleCheck(ThumbnailCleaner.Purge(UInt64(-1), ThumbnailCleanerCallBack));
                  finally
                    Flags := 0;
                    OleCheck(ThumbnailCleaner.Deactivate(Flags));
                  end;
                finally
                  RegCloseKey(Key);
                end;
              finally
                ThumbnailCleaner := nil;
              end;
            end;
          Drive := Drive shl 1;
        end;
    end;
    

    【讨论】:

    • 谢谢!我现在正在查看 IEmptyVolumeCache
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多