从资源管理器中复制文件详细信息作为表格文本

时间:2014-10-29 15:03:18

标签: windows clipboard explorer detailsview

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

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

我希望有一个传输可用列的解决方案,而不仅仅是预定义的集合,例如名称+大小+日期。

您认为有一种简单的方法可以实现此功能吗?如果有必要,我准备用任何语言编程,但我需要一条路可以遵循。我还需要一个程序将它集成到Windows(Vista和更高版本)中,这样只需点击几下就可以了。

1 个答案:

答案 0 :(得分:2)

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

2)在Explorer调用IContextMenu.InvokeCommand之前,它调用IObjectWithSite.SetSite。保存网站价值。

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)从IDataObject中提取当前文件夹的IShellFolder,传递给IShellExtInit.Initialize中的处理程序。

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

6)对于每个PItemIDList:

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

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

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

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

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

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

下载