我正在寻找一种方法来轻松复制Windows资源管理器中显示的文件详细信息(详细信息视图)并将其粘贴为表格文本。
理想情况下,过程是在资源管理器中选择一些文件,在上下文菜单中进行选择(或使用快捷键),然后将列表复制到剪贴板。粘贴时,将保留表格格式,以便Excel识别列或Word保留标签(或创建表格)。
我希望有一个传输可用列的解决方案,而不仅仅是预定义的集合,例如名称+大小+日期。
您认为有一种简单的方法可以实现此功能吗?如果有必要,我准备用任何语言编程,但我需要一条路可以遵循。我还需要一个程序将它集成到Windows(Vista和更高版本)中,这样只需点击几下就可以了。
答案 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
下载