如何创建将多个文件作为参数的 shell 上下文菜单项?

Sim*_*wsi 13 windows windows-7 context-menu

创建将单个文件作为参数的 Windows Shell 上下文菜单项很容易。有关示例,请参阅此问题

但是,如何创建将多个文件作为参数的上下文菜单项?比如说,对于一个差异合并工具(在我的例子中是 P4Merge),尽管相同的技术无疑也适用于其他应用程序。

我已经安装了 P4Merge,但它不会自动将项目添加到上下文菜单中,因此我必须手动进行。

当我尝试使用:

"C:\Program Files\Perforce\p4merge.exe" %1 %2
Run Code Online (Sandbox Code Playgroud)

作为命令行我收到一个错误:

错误:至少需要两个文件。不能只打开一个文件。P4Merge 需要 0、2 或 3 个文件。

当我尝试使用:

"C:\Program Files\Perforce\p4merge.exe" %0 %1
Run Code Online (Sandbox Code Playgroud)

作为命令行,它打开了 P4Merge 的两个实例,每个文件一个。

似乎将正确的文件名传递给 %0 和 %1,但正在为每一个执行 P4Merge 应用程序的不同实例。

我目前有 SourceGear 的 DiffMerge 工具,它在 Shell 上下文菜单上有一个项目,并且效果很好,因为我可以选择两个文件并使用上下文菜单项对它们运行差异。我试图搜索注册表以查看 DiffMerge 使用哪些参数,但我找不到包含参数的 DiffMerge 命令行。

sur*_*asb 24

您还可以尝试将程序添加到 SendTo 菜单。

  • 完美地工作。这里有 [说明](http://www.howtogeek.com/howto/windows-vista/customize-the-windows-vista-send-to-menu/),了解如何将应用程序添加到 Windows 7 中的 SendTo 菜单. 无需添加任何命令行参数,只需将应用程序快捷方式放入 %APPDATA%\Microsoft\Windows\SendTo 文件夹即可。返回 Windows 资源管理器,选择两个文件,然后右键单击并选择发送到 > P4Merge 对所选文件执行差异。 (2认同)

Sim*_*wsi 5

浏览答案似乎没有简单的修复方法,需要 shell 扩展。再次查看 DiffMerge 的注册表项,它似乎使用了外壳扩展:DiffMergeShellExtension64.dll。如果 P4Merge 没有这样的外壳扩展,那么看起来我在 Windows 资源管理器上下文菜单中让它正常工作的唯一方法就是自己编写一个。

Code Project 中的 Complete Idiot's Guide to Writing Shell Extensions系列是编写 shell 扩展的有用指南。本系列的第二部分是关于编写一个可以同时处理多个文件的扩展(正是我需要的)。

警告:编写 Shell 扩展的完整白痴指南使用 C 和 COM、ATL(活动模板库)和 MFC(Microsoft 基础类)。因此,如果您不熟悉这些技术,那么编写 shell 扩展将是一个漫长且可能很困难的过程;这绝对不是你一个小时可以做的。


zen*_*n2k 5

您可以使用我的程序上下文菜单启动器(单实例)来完成此操作:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"
Run Code Online (Sandbox Code Playgroud)