查找图像类型的预览处理程序GUID(gif,bmp,jpg等)

时间:2016-11-02 13:02:38

标签: c# image guid file-extension preview-handler

如果您使用Windows资源管理器并单击.docx或.jpg文件等项目,您将获得在资源管理器like this中单击的项目的预览。我试图在我的Windows窗体应用程序中复制它,它适用于.docx和.xlsx文件,但它不适用于图像文件类型。 据我所知,预览处理程序在filextension / ShellEx中的GUID {8895b1c6-b41f-4c1c-a562-0d564250836f}下注册。使用regedit你可以看到.docx文件有这些.docx previewhandler GUID,但是当你看到像.jpg这样的东西时,没有什么可以找到的。 (的 i.stack.imgur.com/40v6h.png )。 (我不允许发布2个以上的链接)

根据这篇文章的第一个答案( 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;
    }

这是我在这里的第一篇文章,所以我希望我的信息足够多。如果有东西丢失,我会在有机会的时候添加它们。谢谢。

2 个答案:

答案 0 :(得分:0)

那是在本地机器下:

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/

答案 1 :(得分:0)

您应该使用 AssocQueryString 函数,而不是自己对注册表进行爬网。

您告诉它要寻找的shell处理程序:

  • {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1} :IExtractImage
  • {953BB1EE-93B4-11d1-98A3-00C04FB687DA} :IExtractImage2
  • {8895b1c6-b41f-4c1c-a562-0d564250836f} :IPreviewHandler
  • {e357fccd-a995-4576-b01f-234630154e96} :IThumbnailProvider

它将返回您该处理程序的名称。

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);