3

如果您使用 Windows 资源管理器并单击 .docx 或 .jpg 文件之类的项目,您将获得在资源管理器中单击的项目的预览,如下所示。我试图在我的 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;
    }

这是我在这里的第一篇文章,所以我希望我能提供足够的信息。如果有遗漏的东西,我会在有机会时添加它们。谢谢你。

4

2 回答 2

0

与其自己爬取注册表,不如使用AssocQueryString函数。

你告诉它.jpg,你正在寻找什么 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

它将返回该处理程序的 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);
于 2019-05-08T02:07:18.303 回答
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/得到了这个

于 2017-11-08T16:54:23.023 回答