我可以在我的应用程序的一个实例中从资源管理器打开一批文件,在第二个实例中打开一个单独的批处理文件吗?

时间:2013-05-22 15:36:11

标签: c# windows windows-shell

(首先:我知道这与很多其他问题非常相似,但我有其他要求,我没有在其他地方见过。)

我正在创建一个应用程序,用户可以对文件进行一些工作(调整元数据,发送到另一个位置,将来可能还有其他一些东西)。在很多情况下,同样的操作会同时发生在很多文件上,所以我想要做的是,如果用户选择了多个文件,他们可以右键单击并使用某种类型的操作该上下文菜单,以及所有选定的文件和文件夹将传递到我的应用程序进行批量处理。

现在,这是一个棘手的问题 - 当用户在一组文件上进行批量处理时,他们可能会关闭并选择一组不同的文件并对它们设置另一个批量处理操作,并且我需要保持两个批次分开,因为对第一批采取的操作可能不适合第二批。

第二个要求是我遇到问题的地方。我不能只做一个普通的单身人士,因为这两个批次将被集中到一个批次中,这对我的用户来说是一个非常糟糕的事情(tm)。但到目前为止,我还没有找到任何优雅的方法在一个实例中打开一批文件,在新实例中打开一个后续批处理。

我想出了几个选项......首先,当我的应用程序启动时,我可以查找其他实例,依次与每个实例进行通信,以了解它们何时启动,以及时间是否足够接近在一起,关闭这个实例,支持旧实例。第二种选择是以某种方式向命令行参数添加唯一的操作标识符;与第一个选项类似,当应用程序启动时,它会查找自身的其他实例,并尝试找到主要的实例(可能使用标识符作为互斥锁名称的一部分,以便轻松找出哪个是第一个) 。另一种选择可能是创建一个shell扩展来为我捆绑列表并将列表一次性传递给我的应用程序(不确定这是否可行,说实话......)

在我提出的想法中,#2绝对是我的偏好,如果有效的话。它将所有代码保存在C#中,这意味着我的团队中的任何人都可以维护它,并且它还提供了一种将命令明确分组的方法。唯一的问题是我不知道如何为每个实例的args添加一些ID,这对于从单个右键单击操作启动我的应用程序的所有尝试都是一致的,但每次用户都不同单独右键单击+打开(或其他)。也许我可以通过shell扩展来做到这一点......?

如果有人对如何实现这一点有任何建议,我将非常感激。我更喜欢一个相当优雅,强大的解决方案,这个解决方案很容易维护,而不是像我不得不破解我的解决方案那样我最终会遇到的中国商店类型的代码。< / p>

1 个答案:

答案 0 :(得分:0)

这就是我想出来的......

我从C++ Windows Shell context menu handler (CppShellExtContextMenuHandler)获取了代码示例并对其进行了相当大的调整。我开始将它放在*和目录上,因为在我的情况下,用户应该能够对文件和文件夹的任何组合执行此操作。接下来,我没有使用命令弹出消息框,而是将其更改为使用带有重定向标准输入的CreateProcess(根据示例here)。创建进程后,我将文件列表写入管道,每行一个。 (我将尝试更改它以在启动进程之前将文件列表写入管道,以避免潜在的竞争问题。)我的目标应用程序只是逐行读取控制台,直到它耗尽数据,并使用该文件列表。

这是一个比我想要的更长,更危险的过程 - 由于编码扩展的疏忽,我在测试期间几次撞毁了外壳! - 但它确实给了我想要的东西,这是能够在资源管理器中右键单击一组文件,让它们在我的应用程序的同一个实例中打开,然后右键单击一组不同的文件并拥有它们在一个单独的实例中打开。

当然,仅仅因为我有 答案并不意味着它是 的答案。我不会在短时间内将此标记为最终答案,以防其他人带来更好的东西。哎呀,即使你不认为你的答案是更好,我也很乐意听到它!看到别人如何处理问题总是很有趣。