Windows 机密Windows 资源管理器不管理文本

Raymond Chen

以前 有 Send To X PowerToy 工具。它可使您完成一些整理工作,如选择一组文件、右键单击然后选择“Send To Clipboard as Names”。正如所料,该过程将所选文件的名称复制到剪贴板上。

这无疑是一个很有用的 PowerToy,但是它为什么必须首先存在呢?我为什么不能在 Windows® 资源管理器中复制文件然后将其以文本形式进行粘贴来获取文件名称呢?或者不如这样说,为什么我不能简单地将文件从 Windows 资源管理器中拖出,然后将其拖放到记事本来获取文件名称呢?

我们尝试过,但未能成功。

无论是通过剪贴板还是拖放操作,数据传输都是以通过 IDataObject 接口显示的 OLE 数据对象为媒介。一种数据对象提供了多种格式。在 Windows 之初,一些剪贴板格式(包含文本和位图)已经得到解决。随着时间的推移,其他格式也添加进来。当 Windows 首次引入文件拖放功能时,该功能的形式为 HDROP。例如,您可将此功能传递到某些函数(如 DragQueryFile)以获取文件名称。将一些内容从 Windows 资源管理器复制到剪贴板时,结果数据对象将提供上面提到的 HDROP、文件内容、一个文件组描述符以及其他内容。但是您不会注意到的数据对象提供的一种格式就是文本。

放置目标(即可在其上放置对象的目标位置)在得知正将一个数据对象拖放到其上时,将询问该数据对象“您要获取哪种格式?”。该数据对象在响应时,会按优先级降序列举其支持的所有格式。也就是说,数据对象返回的第一种格式就是描述该对象的最佳格式。然后是次最佳格式,依此类推,最后一种格式为描述原始对象的最差格式。例如,代表正在从 Windows 资源管理器窗口拖出的某些对象的数据对象可能先提供一个 shell ID 列表,因为此列表近乎完美地表示了 Windows 资源管理器窗口的内容。此列表中接下来的各项可能依次为一个文件组描述符、文件内容和 HDROP。

回溯至 1998,shell 团队尝试将纯文本添加到所提供格式的列表末尾。其实际意思是:“如果实在没有合适的格式,至少可以从我这里获取一些文本(即文件列表)。”遗憾的是,文本格式失去了大量程序的魅力而用户还在高呼:“哦,我喜欢文本。”这些程序直接转化为仅包含文件列表的文本格式。结果,您将一个文件从 Windows 资源管理器拖放到一个文档中时,此程序仅在该文档中插入文件名称而不是文件本身。

天哪。

由于应用程序兼容性的负面反馈强烈,此更改被迫取消了。结果,当您拖放或粘贴从 Windows 资源管理器复制过来的文件时,shell 数据对象不提供文本形式的文件名称。

然而,Windows Vista® 通过为您提供以文本形式复制路径的方法更正了这个古老的错误:右键单击时按住 Shift 键可获取扩展的上下文菜单。这将出现新的“复制为路径”选项。无需 PowerToy。

Raymond Chen的网站“The Old New Thing”和同名书籍 (Addison-Wesley, 2007) 讨论了 Windows 历史和 Win32 编程。他将实施机制的工作留给了其他人。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.