如果您使用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;
}
这是我在这里的第一篇文章,所以我希望我的信息足够多。如果有东西丢失,我会在有机会的时候添加它们。谢谢。
答案 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);