我正在寻找一种方法来轻松复制出现在 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/