0

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

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

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

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

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

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

如果有人对如何实现这一点有任何建议,我将不胜感激。我更喜欢一个相当优雅、健壮且易于维护的解决方案,而不是那种如果我不得不破解我的解决方案时可能最终得到的代码。

4

1 回答 1

0

这就是我想出的...

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

这是一个比我想要的更长、更危险的过程——我在测试期间崩溃了几次 shell,因为在编码扩展时有疏忽!- 但这正是我想要的,即能够在资源管理器中右键单击一组文件,让它们都在我的应用程序的同一实例中打开,然后右键单击一组不同的文件并拥有它们在单独的实例中打开。

当然,仅仅因为我有答案并不意味着它就是答案。我暂时不会将此标记为最终答案,以防其他人提出更好的建议。哎呀,即使您认为您的答案不是更好,我也很想听听!看到其他人如何解决问题总是很有趣。

于 2013-05-24T14:52:21.770 回答