65.9K
CodeProject 正在变化。 阅读更多。
Home

复制路径上下文菜单扩展

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (14投票s)

2000年5月10日

viewsIcon

198281

downloadIcon

2675

一个允许你复制完整文件路径到剪贴板的上下文菜单 Shell 扩展。

  • 下载源代码 - 270 Kb
  • Sample Image - CopyPathExt.jpg

    引言

    作为一个 Windows 程序员,对我来说,最大的难题之一就是引用完整的文件路径。一个深埋在文件系统中的文件变成了一个难题,因为我,以及我认识的其他程序员,都不想手动输入

    "C:\Windows\System32\Drivers\SomeDriver\AnotherSubFolder\YetAnother\Will-It-Ever-End\MyFile.txt"

    一次又一次。这个烦恼促使我在 1997 年夏天首次涉足上下文菜单扩展领域。最初,我将这个上下文菜单扩展实现为一个 MFC Dll,它完成了这项工作,但它肯定不好看。后来,在 99 年 5 月,在试图熟悉 ATL 和 STL 的过程中,我意识到可以使用 ATL 制作一个更简洁和更高效的版本。所以我就是这么做的。

    这个扩展可能看起来是 Glenn Carr 最近的文章 "Shell Extension to Copy Full Filename Path" 的衍生品 (查看文章),但是是独立开发的(除了最后时刻对 GetCommandString 的一些更改以正确处理 Unicode)。我的只是另一种做几乎相同事情的方法,但有一些额外功能。我决定发布这个替代方案,因为它添加了一些对程序员友好的功能。很久以前就存在一个 PowerToy,它在 "发送到" 菜单中添加了一个选项,允许你做基本相同的事情,但再一次,我认为这个实现添加了足够的东西,使其值得发布。

    在 C 或 C++(或其他类似语言,如 Perl)中处理文件路径时的一个麻烦是这些语言处理文字字符串的方式。它们将反斜杠字符视为转义序列,用于将特殊字符插入到字符串中(例如,"\n" 用于换行)。为了在文字字符串中插入单个反斜杠,必须在代码中包含两个反斜杠(例如,"C:\\config.sys")。可以想象,当处理一个位于子目录混乱深处的文件时,这将是多么令人头疼。在处理文件路径时出现的另一个问题是,在处理那些不太喜欢长文件名或包含空格的文件名的旧应用程序时。

    除了简单地将文件路径复制到剪贴板之外,此扩展还提供功能来解决上述问题。只需在选择菜单项时按住 Control 键,"C-Friendly" 路径将被复制到剪贴板(例如 "C:\\Windows\\System32\\user32.dll")。按住 Shift 键将复制短 "DOS-Friendly" 路径(例如 "C:\Progra~1\Multim~1\sound.wav")。如果渴望,你甚至可以同时按住两者,得到可预测的结果。该扩展还具有多重选择功能、文件和/或目录选择,以及防抱死制动和无划痕表面。此外,正如 Glenn Carr 在他的文章中提到的,无需我进行任何编程工作,在快捷方式上运行扩展会将快捷方式的目标路径复制到剪贴板。

    代码

    该代码由一个 ATL DLL 项目组成,其中包含一个类,CCopyPathContextMenu。像所有上下文菜单一样,它实现了 IContextMenuIShellExtInit 接口。它还支持 IContextMenu2IContextMenu3 接口,但没有使用它们添加的功能。

    • IShellExtInit::Initialize - 从 OLE 数据对象中筛选出选定的文件和目录名称,并将它们添加到基本字符串的 STL 列表中。
    • IContextMenu::QueryContextMenu - 将新菜单项添加到上下文菜单。
    • IContextMenu::GetCommandString - 提供帮助文本,供资源管理器在状态栏上显示。
    • IContextMenu::InvokeCommand - 当用户选择我们的菜单项时调用,将从 Initialize 函数填充的 STL 列表中复制目录和文件名到剪贴板。

    构建版本和注册

    在项目中,你需要考虑几个构建配置
    • bin\ReleaseUMinDependency\ - Unicode
    • bin\DebugU\ - Unicode
    • bin\ReleaseMinDependency\
    • bin\ReleaseMinSize\
    • bin\Debug\
    • bin\ReleaseUMinSize\ - Unicode

    要注册该文件,只需选择适当版本的 DLL(请记住,Unicode 构建在 Win95/98 上无法正常工作),将其复制到适当的位置(建议使用 Windows 系统目录),然后从命令行运行 "RegSvr32 CopyPathExt.dll"。现在,当您右键单击文件或目录时,将出现 "复制路径到剪贴板" 项!

    © . All rights reserved.