Если вы используете проводник Windows и щелкаете такой элемент, как файл .docx или .jpg, вы получаете предварительный просмотр элемента, который вы щелкнули, в проводнике вот так. Я пытаюсь воспроизвести это в своем приложении формы Windows, и он отлично работает для файлов .docx и .xlsx, но не для типов файлов изображений. Насколько я понимаю, обработчики предварительной версии зарегистрированы под идентификатором GUID {8895b1c6-b41f-4c1c-a562-0d564250836f} в filextension / ShellEx. Используя regedit, вы можете увидеть, что файлы .docx имеют этот GUID обработчика предварительного просмотра .docx, но когда вы смотрите на что-то вроде .jpg, там ничего не найдено. (i.stack.imgur.com/40v6h.png). (Мне не разрешено размещать более двух ссылок)
Согласно первому ответу на это сообщение (stackoverflow.com/questions/39373357/how-to-get-the-icon-path-and-index-associated-with-a-file-type) есть и другие места, в которых может храниться обработчик предварительного просмотра для .jpg, но все они кажутся мне пустыми.
Мой вопрос: как мне получить обработчики предварительного просмотра для типов расширений, которые окна могут найти, но не могу. Я думаю, что где-то хранятся обработчики предварительного просмотра, но я не знаю, где они находятся и как до них добраться.
Это код, который я использую для получения GUID файлов. Успешно для типов .docx и .xlsx, но не для типов изображений. Я прохожу мимо всех мест, упомянутых в последней ссылке, но все они оказываются нулевыми.
private Guid GetPreviewHandlerGUID(string filename)
{
// open the registry key corresponding to the file extension
string extention = Path.GetExtension(filename);
RegistryKey ext = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64);
// open the key that indicates the GUID of the preview handler type
string className = Convert.ToString(ext.GetValue(null));
RegistryKey test = ext.OpenSubKey(className + "\\ShellEx\\{8895b1c6-b41f-4c1c-a562-0d564250836f}");
if (test != null) return new Guid(Convert.ToString(test.GetValue(null)));
// sometimes preview handlers are declared on key for the class
if (className != null) {
test = ext.OpenSubKey(extention + "\\ShellEx\\{8895b1c6-b41f-4c1c-a562-0d564250836f}");
if (test == null)
test = ext.OpenSubKey("SystemFileAssociations\\" + className + "\\ShellEx\\{8895b1c6-b41f-4c1c-a562-0d564250836f}");
if (test == null)
test = ext.OpenSubKey("SystemFileAssociations\\" + extention + "\\ShellEx\\{8895b1c6-b41f-4c1c-a562-0d564250836f}");
if (test == null)
test = ext.OpenSubKey("SystemFileAssociations\\image\\ShellEx\\{8895b1c6-b41f-4c1c-a562-0d564250836f}");
if (test != null) return new Guid(Convert.ToString(test.GetValue(null)));
}
return Guid.Empty;
}
Это мой первый пост, поэтому я надеюсь, что был достаточно информативным. Если чего-то не хватает, я добавлю их, когда у меня будет возможность. Спасибо.