windows - 将资源管理器中的文件详细信息复制为表格文本

标签 windows clipboard explorer detailsview

我正在寻找一种方法来轻松复制出现在 Windows 资源管理器(详细信息 View )中的文件详细信息并将其粘贴为表格文本。

理想情况下,该过程是在资源管理器中选择一些文件,在上下文菜单中做出选择(或使用快捷键),然后列表将被复制到剪贴板。粘贴时,表格格式将被保留,以便 Excel 识别列或 Word 保持制表符(或创建表格)。

我想要一个传输可用列的解决方案,而不仅仅是一个预定义的设置详细信息,例如名称 + 大小 + 日期。

您认为有一种简单的方法可以实现此功能吗?如有必要,我准备好使用任何语言进行编程,但我需要一条路可走。我还需要一个将它集成到 Windows(Vista 和更高版本)中的过程,以便单击几下就足够了。

最佳答案

1) 创建上下文菜单 shell 扩展。它必须实现 IShellExtInit、IContextMenu(2,3) 和 IObjectWithSite。在 HKCR\AllFilesystemObjects 键上注册您的 shell 扩展。

2) 在资源管理器调用 IContextMenu.InvokeCommand 之前,它会调用 IObjectWithSite.SetSite。节省网站值(value)。

3) IContextMenu.InvokeCommand 内部:

Site.QueryInterface(IServiceProvider, ServiceProvider)
ServiceProvider.QueryService(SID_SFolderView, IColumnManager, ColumnManager)
ColumnManager.GetColumnCount(CM_ENUM_VISIBLE, Count)
GetMem(Keys, SizeOf(PPropertyKey) * Count)
ColumnManager.GetColumns(CM_ENUM_VISIBLE, Keys, Count)

现在您拥有所有可见列的数组。

4) 从传递给 IShellExtInit.Initialize 中的处理程序的 IDataObject 中提取当前文件夹的 IShellFolder。

5) 提取IDataObject中每个文件的PItemIDList。

6) 对于每个 PItemIDList:

6.1) 调用 ShellFolder.BindToObject(Child, nil, IPropertyStore, PropertyStore) 获取 item 的 PropertyStore。

6.2) 对于 Keys 数组中的每个 PropertyKey:

6.2.1) 调用 PropertyStore.GetValue(PropertyKey, Value);

6.2.2) 使用 PropVariantToStringAlloc 函数将值转换为字符串。

6.2.3) 在您的内部 txt 存储中存储值的字符串表示。

7) 将您的 txt 存储复制到剪贴板。

8) 释放所有资源。

更新 1

您也可以尝试使用 IShellFolder2.GetDetailsEx 而不是使用 IPropertyStore。

更新 2

在使用 IPropertyStore 的情况下,您还可以调用 IPropertySystem.FormatForDisplayAlloc 来格式化值。例如,对于 PKEY_Size PropertyStore.GetValue 返回“100000”,但 PropertySystem.FormatForDisplayAlloc 会将值格式化为“100 KB”。

更新 3

这是一项非常有趣的任务,所以我创建了自己的 shell 扩展,它将详细信息复制到剪贴板。可以通过链接下载http://www.shellace.com/bin/CopyDetails.zip

关于windows - 将资源管理器中的文件详细信息复制为表格文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633794/

相关文章:

windows - Perl:为什么我会收到错误 "The file name, directory name, or volume label syntax is incorrect."

wpf - 如何枚举剪贴板格式

Javascript - 将字符串作为文本/html复制到剪贴板

javascript - 为什么从上下文菜单中复制停止工作?

c# - 在资源管理器中打开文件夹并选择文件

c# - 需要以编程方式编辑远程机器上的文件

windows - 为什么在 Windows 上尝试 Socket.connect 失败需要 1 秒?

windows - 我应该在 64 位版本中同时定义 _WIN32 和 _WIN64 吗?

delphi - 打开Windows资源管理器目录,选择特定文件(在Delphi中)

css - Explorer (11) 字体包含不起作用