问题标签 [ipreviewhandler]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5501 浏览

windows - 如何获取文件扩展名的 IPreviewHandler?

如何获取IPreviewHandler特定文件扩展名的外壳?

背景

Windows 允许开发人员为其自定义文件类型创建预览处理程序:

Preview handlers are called when an item is selected to show a lightweight, rich, read-only preview of the file's contents in the view's reading pane. 这是在不启动文件的关联应用程序的情况下完成的。

预览处理程序是托管应用程序。主机包括 Windows Vista 或 Microsoft Outlook 2007 中的 Windows 资源管理器。

我想利用现有的IPreviewHandler基础设施来获取文件的缩略图。

在流中

问题是我的文件没有放在 shell 命名空间中(即它们没有放在硬盘上)。它们位于内存中,可通过IStream. 这意味着我不能使用旧版IExtractImage界面;因为它不支持从Stream加载文件。

幸运的是,这就是现代IPreviewHandler支持(推荐和更喜欢)从 a 加载数据Stream,并建议不要从文件加载预览的原因:

此方法优于Initialize,因为它能够使用无法通过 Win32 路径访问的流,例如具有 .zip 文件扩展名的压缩文件的内容。

那我怎么得到它?

没有关于获取与特定扩展相关联的正确方法的文档。IPreviewHandler但是,如果我按照如何注册的指示IPreviewHandler并从另一方阅读合同

鉴于我知道扩展名,我应该能够遵循相同的路线。让我们用一个真实的例子,一个.jpg文件:

在此处输入图像描述

在此处输入图像描述

请注意,该文件具有预览。请注意,我包含第二个屏幕截图只是为了强调预览不是来自硬盘驱动器上的文件的想法。

让我们拼写吧!

.jpg首先是它是一个文件的事实:

{8895b1c6-b41f-4c1c-a562-0d564250836f}等等, previewhandler没有子键。这一定意味着我们无法获得.jpg文件的缩略图。

减少荒谬

真正的问题

细心的读者会意识到我要问的实际问题是:

如何获得仅包含在流中的图像的预览?

虽然这是一个有用的问题,也是我遇到的真正问题,但如何使用的答案IPreviewHandler也是一个有用的问题。

因此,请随意回答;或两者!

奖金阅读

0 投票
1 回答
811 浏览

c# - 如何禁用给定文件路径的预览处理程序

我正在用 C# 编写一个应用程序,并考虑使用PreviewHandlerWindows。我刚刚开始工作,Windows Explorer所以Preview Handler不知道该做什么以及从哪里开始。坦率地说,不知道它是如何工作的,所以任何指导都会有所帮助。

要求是禁用给定文件路径的文件\文件夹预览。假设我已经共享了一个 filePath C:\User\abcd\MyDocuments\Pictures ,并且在这个文件夹中有 10 个文件,那么默认情况下 Windows 会显示文件的预览。我们的要求是禁用文件预览。

这可以做到吗?如果是这样,任何人都可以指导我如何实现这一目标?

对于给定的文件扩展名,我们可能希望禁用预览。喜欢.png文件而不是.pdf文件。

请提供任何指导。

[编辑]

让我重新表述我的问题。如何在预览窗格中为文件提供自定义预览?假设我想根据某些条件在预览窗格中显示图像文件,我可以这样做吗?我可以在自己的代码中添加一些条件,以便在某些情况下不会出现/不出现预览。

谢谢德布

0 投票
2 回答
670 浏览

delphi - IPreviewHandler 卸载 COM 对象需要很长时间并冻结应用程序

我正在尝试使用 IPreviewHandler 界面在我的应用程序中的 TPanel 上显示类似 Windows 7 的预览。

当我通过调用 Unload(这意味着处置 COM 对象)然后对对象进行 niling 来销毁预览对象时,就会出现问题。应用程序将冻结(直接在析构函数之后),直到预览主机进程退出。这可能需要几分钟。使用 adobe 预览 .pdf 时会发生很多情况。

我想知道是否有办法避免这种情况/或另一种方法来完成文件预览?

创建预览

0 投票
1 回答
142 浏览

c++ - IPreviewHandler SetWindow 未指定大小

我想在我的窗口上添加预览。一个矩形被传递到将在其中绘制预览的函数中,但由于某种原因,预览是在整个窗口中绘制的,而不是在指定的矩形中。

如何设置绘图矩形,使预览只在其中?

0 投票
1 回答
376 浏览

c# - 如何在.Net最新版本中获取文件类型的IPreviewHandler

最近在工作中,我收到一个项目,要求我预览特定文件类型并将其显示在预览窗格中(类似于 Windows 文件资源管理器中的预览窗格)。在对如何实现这一目标进行了 3 或 4 天的广泛研究之后,我完全被难住了。

起初我尝试关注这篇文章如何获取文件扩展名的 IPreviewHandler?但除了一些非常长的随机错误代码之外,我永远无法让 AssocQueryString 返回任何内容。在寻找另一种解决方案后,我偶然发现了这篇文章https://www.brad-smith.info/blog/archives/183在按照他的教程并下载示例代码之后,我能够生成 Word 文档的预览,但是不适用于任何其他文件类型。使这成为可能的代码是这里的这些行

在使用调试器后,我发现 word 文档返回 System.__ComObject,而我试图为其生成预览的文件类型返回用于创建 ShellExtension 的类的实例。所以我回到互联网进行更多研究,发现了这个 CodeProject 示例https://www.codeproject.com/Articles/25465/Using-Vista-Preview-Handlers-in-a-WPF-Application。这个项目实际上为我正在寻找的文件类型生成了预览!我非常兴奋,直到我注意到该项目使用了与上面完全相同的代码生成预览!我非常困惑,直到我注意到两个项目的 System.dll 是不同的版本。一个有效的目标是 .Net 3.5,另一个目标是 .Net 4.6.1,这很不幸,因为我们的项目使用的是 .Net 4.6.1。

所以现在你已经跟上了速度,这是我的问题。无论如何,在 .Net 4.6.1 中是否可以像在 .Net 3.5 中一样获得文件的预览?有谁知道这两个版本之间有什么变化?或者也许有一种完全不同的方法可以更好地做到这一点?提前致谢!

PS 在 .Net 3.5 项目中使用调试器时,我注意到 Type.GetTypeFromCLSID 返回一个 System.__ComObject ,这也是它为 word 文档返回的内容。这有关系吗?此外,虽然 .Net 3.5 确实生成了预览,但它会引发此异常 System.Runtime.Serialization.SerializationException:“尝试反序列化空流。” 我不知道这是否有帮助,但我想我会包括它以防万一。

0 投票
0 回答
360 浏览

c++ - 如何在对话框中托管预览处理程序

我正在尝试在对话框中托管文件预览处理程序。我已经为资源管理器中的选择更改设置了一个事件接收器。When the selection changes, I feed the selected shell item to the dialog, which in turn feeds it to a function that prepares the preview frame.

一般来说,它会成功加载正确的处理程序并显示文件的内容,但对于某些文件类型(即 Excel 和 Word 文件),它会遇到诸如焦点丢失或闪烁等各种问题。这是一个 Excel 预览处理程序弄乱焦点的演示(我的意思是弄乱,我的意思是它错误地从资源管理器中窃取了焦点,我想保持焦点):

在此处输入图像描述

Word 文件可能会成功加载一次,但随后会失败,尤其是在打开 Word 的情况下。

至于代码:

对于初学者,这是我从文件扩展名中获取预览处理程序的函数。这似乎工作正常:

现在这是我的对话框中准备预览的函数,给定一个 shell 项 (m_pPreviewHandler是活动的预览处理程序,IDC_PREVIEWFRAME是对话框中预览窗格的占位符,并且m_mapExtsToPreviewHandlers只是一个用于在用户遇到预览处理程序时存储它们的映射):

有谁知道我做错了什么或者什么可以解决这些焦点问题?

我也试过LockSetForegroundWindow在不同的地方放置,但没有锁。

此外,对话框资源如下所示:

在此处输入图像描述

0 投票
0 回答
270 浏览

c++ - 如何通过代理主机运行文件预览处理程序

根据文档

预览处理程序总是用完进程。有两种实现方法:

  1. 预览处理程序可以构建为进程内服务器,但通过进程外代理主机运行。这是首选方法。系统在 Prevhost.exe 文件中为此提供了一个代理主机。通过此方法构建的预览处理程序与 Windows XP 上的 Outlook 2007 不兼容。但是,这些相同的处理程序将在 Windows 资源管理器和 Windows Vista 上运行的 Outlook 2007 中工作。

  2. 预览处理程序可以构建为本地组件对象模型 (COM) 服务器。出于多种原因,不建议这样做。首先,进程内服务器的实现更容易。更重要的是,作为进程内服务器的实现可以更好地控制处理程序对象的生命周期,从而实现更好的清理和效率。

主机如何以第一种方式运行预览处理程序?我尝试过像这样实例化预览处理程序,但与资源管理器中的预览处理程序不同,这不会导致预览处理程序代理主机的启动:

你需要一个不同的标志CoCreateInstance,还是你完全需要其他方法?尝试在 proc 中为 Office 文件实例化处理程序总是失败。