从c#更新图像缩略图

问题描述 投票:-2回答:2

我正在Win 10的WinForms应用中通过C#以编程方式处理JPEG图像,并希望文件资源管理器显示经过处理的图像,而不是原始图像的缩略图。关闭资源管理器,删除%LocalAppData%\ Microsoft \ Windows \ Explorer \ thumbcache _ *。db并重新启动,但这会很慢并且很麻烦。我想以编程方式更新单个文件的缩略图。当通过“资源管理器”上下文菜单旋转图像时,Windows会执行此操作,但是从程序执行此操作的方法尚不清楚。

我当前用于关闭资源管理器,删除缩略图缓存文件并重新启动的批处理文件是

taskkill /f /im explorer.exe
timeout 2 /nobreak>nul
DEL /F /S /Q /A %LocalAppData%\Microsoft\Windows\Explorer\thumbcache_*.db
timeout 2 /nobreak>nul
start "" %windir%\explorer.exe
start "" %windir%\explorer.exe "Folder To Update"
c# winforms pinvoke thumbnails
2个回答
0
投票

执行类似操作的正确方法是使用SHChangeNotify()函数。如果您使用的是C#,则可以像这样p /调用它:

[DllImport( "Shell32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern void SHChangeNotify(uint wEventId, uint uFlags, [MarshalAs(UnmanagedType.LPWStr)] string dwItem1, IntPtr dwItem2);

...然后使用它通知资源管理器项目已被修改(即您操作的图像):

private const uint SHCNE_UPDATEITEM = 0x00002000;
private const uint SHCNF_PATHW = 0x0005;
private const uint SHCNF_FLUSH = 0x1000;

string pathName = "your image file.jpg"

SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW | SHCNF_FLUSH, pathName, IntPtr.Zero);

0
投票

将文件修改日期增加1秒钟,然后再将其修改回来,则会触发Windows认为文件已更改,从而更新了缩略图。使用的代码是

DateTime modDate = System.IO.File.GetLastWriteTime(sFile);
System.IO.File.SetLastWriteTime(sFile, modDate.AddSeconds(1.0));
System.IO.File.SetLastWriteTime(sFile, modDate.AddSeconds(-1.0));
© www.soinside.com 2019 - 2024. All rights reserved.