Я сделал приложение, которое представляет вам список файлов на вашем компьютере. Всякий раз, когда вы нажимаете какой-либо элемент в списке, небольшая PictureBox рядом с ним должна показывать миниатюру соответствующего файла. Я использую С# в Windows 7.
Чтобы получить миниатюру, я повторил метод, опубликованный в другом вопросе. Во-первых, я ссылаюсь на пакет кода Windows API. Затем я использую следующий код:
ShellFile shellFile = ShellFile.FromFilePath(fullPathToFile);
myPictureBox.Image = shellFile.Thumbnail.LargeBitmap;
Это не всегда работает. Иногда показанный снимок - это просто значок "по умолчанию". Я узнал, что реальный эскиз показан только в том случае, если Windows ранее создала миниатюру для этого файла и сохранила ее в кеше эскизов. Это означает, что мне нужно вручную открыть папку, дождитесь, когда Windows создаст миниатюры для каждого файла, а затем мое приложение сможет увидеть эти большие пальцы.
Как моя программа заставляет Windows 7 генерировать реальные эскизы перед их использованием?
Обновление (по Li0liQ)
Можно принудительно извлекать эскизы, добавив FormatOption:
ShellFile shellFile = ShellFile.FromFilePath(fullPathToFile);
shellFile.Thumbnail.FormatOption = ShellThumbnailFormatOption.ThumbnailOnly;
myPictureBox.Image = shellFile.Thumbnail.LargeBitmap;
однако, я получаю исключение, если миниатюра еще не существует:
В текущем объекте ShellObject нет действительного обработчика эскизов или возникла проблема с извлечением миниатюры для этой конкретной объект оболочки. --- > System.Runtime.InteropServices.COMException: Класс не зарегистрировано (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
См. Как обновить миниатюру файла в проводнике Windows? Вопрос и код фрагмент для потенциальных подсказок.