Поиск GUID обработчика предварительного просмотра для типов изображений (gif, bmp, jpg и т. Д.)
Если вы используете проводник Windows и щелкаете по элементу, такому как файл.docx или.jpg, вы получаете предварительный просмотр элемента, который вы щелкнули в проводнике, как этот. Я пытаюсь воспроизвести это в моем приложении Windows Form, и оно отлично работает для файлов.docx и.xlsx, но не для файлов изображений. Насколько я понимаю, обработчики предварительного просмотра зарегистрированы под GUID {8895b1c6-b41f-4c1c-a562-0d564250836f} в filextension/ShellEx. Используя regedit, вы можете видеть, что файлы.docx имеют эти GUID.docx previewhandler, но когда вы смотрите на что-то вроде.jpg, ничего не может быть найдено. (https://stackru.com/images/7e07106c6bd8aa7ada2a78646f25ee05cad61df7.png). (Мне не разрешено размещать более 2 ссылок)
Согласно первому ответу на этот пост (stackru.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;
}
Это мой первый пост здесь, поэтому я надеюсь, что я был достаточно информативным. Если чего-то не хватает, я добавлю его, когда у меня будет шанс. Спасибо.
1 ответ
Вот под локальной машиной:
HKEY_LOCAL_MACHINE \ Software \ Classes \ giffile \ ShellEx{8895b1c6-B41F-4c1c-a562-0d564250836f}
Я получил это, декомпилировав PreviewConfig http://www.winhelponline.com/blog/previewconfig-tool-registers-file-types-for-the-preview-pane-in-windows-vista/
Вместо того, чтобы самостоятельно сканировать реестр, вам следует использовать функцию AssocQueryString.
Ты говоришь это .jpg
, и какой обработчик оболочки вы ищете:
{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
: IExtractImage{953BB1EE-93B4-11d1-98A3-00C04FB687DA}
: IExtractImage2{8895b1c6-b41f-4c1c-a562-0d564250836f}
: IPreviewHandler{e357fccd-a995-4576-b01f-234630154e96}
: IThumbnailProvider
и он вернет вам clsid этого обработчика.
Псевдокод в стиле C#:
private Guid GetShellObjectClsid(String filename, Guid desiredHandler)
{
String ext = Path.GetExtension(filename);
String sInterfaceID = desiredHandler.ToString("B"); // B ==> The COM format {xxxx}
uint bufferLen = 100; //more than enough to hold a 38 character clsid
StringBuilder buffer = new StringBuilder(bufferLen);
HRESULT hr = AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_SHELLEXTENSION,
ext, buffer, ref bufferLen);
if (hr != S_OK)
{
//Marhsal.ThrowExceptionForHR(hr);
return null;
}
String s = sb.ToString();
return new Guid(sb.ToString());
}
Итак, теперь, если вы хотите IPreviewHandler
для типа файла:
Guid previewHandlerClsid = GetShellObjectClsid("a.jpg", IID_IPreviewHandler);