替换" .jpg"缩略图处理程序

时间:2017-08-29 08:01:22

标签: windows windows-10 thumbnails windows-shell thumbnail-handler

我为Windows 10编写了一个新的缩略图处理程序。当我将它应用于我的自定义" .mic"文件(重命名" .jpg"文件)处理程序运行良好。但是,出于某种原因,并没有为#34; .jpg"文件。

这些是我在" DllRegisterServer"中添加到注册表的条目:

    // List of registry entries we want to create
    const REGISTRY_ENTRY rgRegistryEntries[] =
    {
        { HKEY_LOCAL_MACHINE,   L"Software\\Classes\\CLSID\\" SZ_CLSID_MYTHUMBHANDLER,                         REG_SZ,   NULL,               SZ_XDRVTHUMBHANDLER },
        { HKEY_LOCAL_MACHINE,   L"Software\\Classes\\CLSID\\" SZ_CLSID_MYTHUMBHANDLER L"\\InProcServer32",     REG_SZ,   NULL,               szModuleName },
        { HKEY_LOCAL_MACHINE,   L"Software\\Classes\\CLSID\\" SZ_CLSID_MYTHUMBHANDLER L"\\InProcServer32",     REG_SZ,   L"ThreadingModel",  L"Apartment" },
        { HKEY_LOCAL_MACHINE,   L"Software\\Classes\\.mic\\ShellEx\\{e357fccd-a995-4576-b01f-234630154e96}" ,  REG_SZ,   NULL,               SZ_CLSID_MYTHUMBHANDLER },
        { HKEY_LOCAL_MACHINE,   L"Software\\Classes\\.jpg\\ShellEx\\{e357fccd-a995-4576-b01f-234630154e96}" ,  REG_SZ,   NULL,               SZ_CLSID_MYTHUMBHANDLER },
    };

    hr = S_OK;
    for (int i = 0; i < ARRAYSIZE(rgRegistryEntries) && SUCCEEDED(hr); i++)
    {
        hr = CreateRegKeyAndSetValue(&rgRegistryEntries[i]);
    }

当我尝试使用&#34; ThumbnailProvider.exe&#34;来测试我的处理程序时实用程序(随Windows SDK提供),效果很好。我使用&#34; .jpg&#34;运行该实用程序。文件,我的处理程序已成功调用。

为什么我的处理程序不被资源管理器调用?

编辑:
在其他一些PC上,它似乎完美无缺。我的原始注册码运作良好,我的处理程序正在调用&#34; jpg&#34;文件。两台PC都有Windows 10,实际上它们是使用相同基本映像的VM。

编辑:
我注意到我的处理程序正在调用一些&#34; .jpg&#34;文件,在其他文件上它没有。我可能在这里错了,但我在文件中注意到的主要区别是&#34;解决方案单元&#34;属性。对于工作文件,此属性没有值,对于非工作文件,此属性的值为&#34; 2&#34;。我在所有PC上都有同样的行为。 知道这个属性如何影响被调用的缩略图处理程序?如果它不是&#34;解决单位&#34;财产,导致它的区别是什么?

2 个答案:

答案 0 :(得分:2)

MSDN says注册新的扩展程序处理程序对象时需要调用SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)

  

如果您未调用SHChangeNotify,则可能无法识别更改   直到系统重新启动。

在我的机器上,Microsoft处理程序在HKLM\SOFTWARE\Classes\SystemFileAssociations\image下注册为通用处理程序,我相信该键应该具有较低的优先级,但可能值得调查。正如Simon的评论中所述,shell从HKCR读取,这是一个组合视图,其中HKEY_CURRENT_USER可以覆盖HKEY_LOCAL_MACHINE,因此您还应该确保没有为您的特定用户设置任何内容。

进入semi-documented区域,我们看到资源管理器可以在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\CachedHKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Cached下缓存一些CLSID信息,因此如果所有其他方法都失败,您可以尝试删除这些密钥(至少在HKCU应该可以安全删除)。

答案 1 :(得分:0)

我想我找到了为什么没有在某些“.jpg”文件上调用我的缩略图处理程序的原因。似乎有些jpg图像里面有嵌入的缩略图。因此,对于这些文件,根本不会调用缩略图处理程序 我使用exiftool实用程序来读取图像属性,在输出中我看到以下几行:
Photoshop Thumbnail : (Binary data 8015 bytes, use -b option to extract) Thumbnail Image : (Binary data 8015 bytes, use -b option to extract)

我使用exiftool从文件中删除缩略图。一旦我这样做,我的处理程序就成功调用了这个图像。