(首先:我知道这与许多其他问题非常相似,但我有一个在其他地方没有见过的次要要求。)
我正在创建一个应用程序,用户可以在其中对文件进行一些工作(调整元数据,发送到另一个位置,将来可能还有其他一些事情)。在很多情况下,相同的操作会同时发生在很多文件上,所以我想做的是,如果用户选择了多个文件,他们可以右键单击并使用某种操作该上下文菜单,所有选定的文件和文件夹都将传递给我的应用程序进行批量处理。
现在这是一个棘手的问题 - 当用户对一组文件进行批量处理时,他们可能会选择另一组文件并对其设置另一个批量处理操作,我需要将这两个批次分开,因为对第一批采取的行动可能不适用于第二批。
第二个要求是我遇到问题的地方。我不能只做一个普通的单例,因为这两个批次会合并为一个批次,这对我的用户来说是一件非常糟糕的事情(tm)。但到目前为止,我还没有找到任何优雅的方法来在一个实例中打开一批文件,然后在一个新实例中打开另一批文件。
我想出了几个选项...首先,当我的应用程序启动时,我可以查找其他实例,依次与每个实例通信以了解它们何时启动,如果时间足够接近,请关闭取消这个实例以支持较旧的实例。第二种选择是以某种方式将唯一的操作标识符添加到命令行参数;与第一个选项类似,当应用程序启动时,它会查找自身的其他实例并尝试找到作为主实例的实例(可能使用标识符作为互斥体名称的一部分,以便轻松找出哪个实例是第一个) . 另一种选择可能是创建一个 shell 扩展来为我捆绑列表并将列表一次性传递给我的应用程序(不知道这是否可行,老实说......)
在我提出的想法中,如果可行的话,#2 绝对是我的首选。它将所有代码保存在 C# 中,这意味着我团队中的任何人都可以维护它,并且它还提供了一种将命令明确分组的方法。唯一的问题是我不知道有一种方法可以为每个实例的 args 添加一些 ID,这对于从单个右键单击操作启动我的应用程序的所有尝试都是一致的,但每次用户都不同做一个单独的右键单击+打开(或其他)。也许我可以通过外壳扩展来做到这一点......?
如果有人对如何实现这一点有任何建议,我将不胜感激。我更喜欢一个相当优雅、健壮且易于维护的解决方案,而不是那种如果我不得不破解我的解决方案时可能最终得到的代码。