Поиск идентификаторов GUID обработчика предварительного просмотра для типов изображений (gif, bmp, jpg и т. Д.)

Если вы используете проводник 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;
    }

Это мой первый пост, поэтому я надеюсь, что был достаточно информативным. Если чего-то не хватает, я добавлю их, когда у меня будет возможность. Спасибо.


person Skulltag    schedule 02.11.2016    source источник


Ответы (2)


Это под локальной машиной:

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/

person Jason Ching    schedule 08.11.2017

Вместо того, чтобы сканировать реестр самостоятельно, вы должны использовать 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);
person Ian Boyd    schedule 08.05.2019