Поиск 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);
Другие вопросы по тегам