Обновить миниатюру изображения с c# - PullRequest
0 голосов
/ 14 апреля 2020

Я манипулирую изображениями JPEG программно из C# в приложении WinForms в Win 10 и хотел бы, чтобы в Проводнике файлов отображались измененные, а не исходные миниатюры изображений. Закрытие проводника, удаление% 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"

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Увеличение даты изменения файла на 1 единицу c и последующее его изменение приводит к тому, что 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));
0 голосов
/ 15 апреля 2020

Правильный способ сделать что-то подобное - использовать функцию 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...