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

本文关键字:一批 实例 文件 单独 另一个 应用程序 我的 一个 我可以 资源管理器 | 更新日期: 2023-09-27 18:15:04

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

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

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

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

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

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

如果有人有任何关于如何实现这一点的建议,我将非常感激。我更喜欢一个相当优雅的、健壮的、易于维护的解决方案,而不是那种在中国商店里买牛的代码,如果我不得不破解一个解决方案的话,我很可能最终会遇到这种代码。

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

这是我想出来的…

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

这是一个比我想要的更漫长和更危险的过程——在测试期间,由于编码扩展的疏忽,我崩溃了几次shell !-但它给了我确切的我想要的,这是在资源管理器中右键单击一组文件的能力,让他们都在我的应用程序的同一实例中打开,然后右键单击另一组文件,并在一个单独的实例中打开它们。

当然,仅仅因为我有的答案并不意味着它就是答案。我暂时不打算把这个作为最终答案,以防有人提出更好的答案。见鬼,即使你不认为你的答案更好,我也很想听到!看别人如何处理一个问题总是很有趣的。