【问题标题】:Replacing ".jpg" thumbnail handler替换“.jpg”缩略图处理程序
【发布时间】:2018-02-06 14:13:36
【问题描述】:

我为 Windows 10 编写了一个新的缩略图处理程序。当我将它应用于我的自定义“.mic”文件(重命名为“.jpg”文件)时,处理程序运行良好。但是,由于某种原因,根本没有为“.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]);
    }

当我尝试使用“ThumbnailProvider.exe”实用程序(随 windows SDK 提供)测试我的处理程序时,它运行良好。我使用“.jpg”文件运行该实用程序,并成功调用了我的处理程序。

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

编辑:
在其他一些 PC 上,它似乎工作得很好。我的原始注册码运行良好,我的处理程序被调用用于“jpg”文件。两台 PC 都有 Windows 10,实际上它们是使用相同基础映像的虚拟机。

编辑:
我注意到我的处理程序被一些“.jpg”文件调用,而其他文件则没有。我在这里可能错了,但我注意到文件之间的主要区别是“分辨率单元”属性。对于工作文件,此属性没有值,对于非工作文件,此属性的值为“2”。我在所有 PC 上都得到相同的行为。 知道这个属性如何影响被调用的缩略图处理程序吗?如果不是“分辨率单位”属性,可能是什么差异导致它?

【问题讨论】:

  • Software\\Classes\\.jpg 的默认值通常包含“jpegfile”(也可以是其他任何内容),因此 shell 将改为查看 Software\\Classes\\jpegfile,如果那是案子。还要确保 HKCU 不会覆盖任何内容。有关信息,HKCR 是 HKLM+HKCU Software\\Classes 的组合视图。
  • 我按照你说的做了,我把它添加到“jpegfile”和“.jpeg”中。我看到所有这些都配置了我在 HKCR 下的处理程序。但是,仍然没有为“.jpg”文件调用我的处理程序。

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


【解决方案1】:

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

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

在我的机器上,Microsoft 处理程序在HKLM\SOFTWARE\Classes\SystemFileAssociations\image 下注册为通用处理程序,我相信该密钥的优先级应该较低,但可能值得研究。正如 Simon 在 cmets 中所指出的,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 下的那个应该可以安全删除)。

【讨论】:

  • 我的处理程序基于 Windows SDK 中的“Recipe”示例,所以我已经调用了SHChangeNotify。我尝试删除您提到的半记录缓存,但它仍然不起作用。重新启动也没有帮助。我也尝试了@SimonMourier 的建议。
  • 我也想尝试修改HKLM\SOFTWARE\Classes\SystemFileAssociations\image,但是这个key是只读的,不能修改。
  • 某些密钥归系统/受信任的安装程序所有,您需要先取得密钥的所有权,然后才能更改 ACL。
  • 我已经按照你说的修改了HKLM\SOFTWARE\Classes\SystemFileAssociations\image。现在可以看到,我的处理程序正在为“.png”文件调用,但由于某种原因,它仍然没有为“.jpg”文件调用。
  • 尝试 Process Monitor 并查看 Explorer 用于查找处理程序的所有键...
【解决方案2】:

我想我找到了一些“.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 从文件中删除缩略图。一旦我这样做了,我的处理程序就被成功地调用了这个图像。

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多