Windows 如何使文件关联在单个程序实例中打开多个文件?

Windows 如何使文件关联在单个程序实例中打开多个文件?,windows,shell,registry,associations,Windows,Shell,Registry,Associations,我已经在注册表中为我的程序设置了文件扩展名 在注册表中,在shell/open/command下,我得到: "C:\MyProgramPath\MyProgram.exe" "%1" 这对我来说很好。当有人单击与我的应用程序关联的一个或多个文件时,我的应用程序会正确打开这些文件,但每个文件都会在单独的程序实例中打开 有什么方法可以在一个程序实例中打开所有文件吗?这是一个相当常见的问题,实际上与Windows文件扩展名无关。双击程序自定义类型的文件时,Windows将启动关联的应用程序MyPr

我已经在注册表中为我的程序设置了文件扩展名

在注册表中,在shell/open/command下,我得到:

"C:\MyProgramPath\MyProgram.exe" "%1" 
这对我来说很好。当有人单击与我的应用程序关联的一个或多个文件时,我的应用程序会正确打开这些文件,但每个文件都会在单独的程序实例中打开


有什么方法可以在一个程序实例中打开所有文件吗?

这是一个相当常见的问题,实际上与Windows文件扩展名无关。双击程序自定义类型的文件时,Windows将启动关联的应用程序
MyProgram.exe
,并将文件名
%1
作为命令行参数传递

现在,如果您只需要应用程序的一个实例,则需要执行以下操作:

  • 当你的程序(
    MyProgram.exe
    )启动时,它应该检查是否已经有一个实例在运行
  • 如果存在以前的实例,
    MyProgram.exe
    的新实例应该向旧实例发送一条消息(某种类型的,不一定是windows消息),告诉它打开文件
    %1
  • 新实例现在应该自行终止
  • 非常简单的方法 有几种方法可以实现这一点。最简单的方法之一是每次启动应用程序时设置注册表项/值,并在应用程序存在时将其删除。然后,当应用程序(的新实例)启动时,在设置此键/值之前,它应该检查是否已设置。如果是,请遵循上述步骤(2)和(3)。这可能不是最稳定的方法(事实上,这是一个非常糟糕的主意,因为如果应用程序不正常地删除密钥/值,您无法保证应用程序在其存在时会删除该密钥/值),但它将为您提供基本的想法。其他可能更好的方法包括,甚至更好的是,使用

    第二步可以通过发送windows消息(可能)、设置注册表值、写入文件或。。。不同进程之间有许多通信方式

    细节 由于这是一个相当普遍的问题,以前也曾处理过。例如,请参见。

    您可以在使用时使用。有关Delphi中的示例,请参见

    编辑:


    您提供的链接介绍了另一种方法:使用IDropTarget。这可能更适合您已经运行的拖放功能。

    不幸的是,将其构建到我的程序中总是会阻止多个实例。但那不是我想要的。如果单击文件A,我希望它位于实例1中。如果单击了文件B,那么我希望它出现在实例2中。但是,如果在同一次单击中同时单击A和B,那么它们将是同时传递给程序的两个参数,我希望它们都在一个实例中打开。我为什么要那样?因此,它将具有与使用2个参数从命令行运行我的程序相同的效果,或者将2个文件拖放到我的程序中。谢谢,但这对我没有帮助。@Ikessler:我明白了。我不明白你是这么想的。也许你应该把这个写在你的问题里?很抱歉没有早点提出来,但直到你给出答案我才意识到这是相关的。非常感谢您花时间编写详细的答案。在我链接到的MSDN页面上,它显示“注意:DDE方法已被弃用;请改用DropTarget方法。”我很难弄清楚如何在Delphi中设置IDropTarget。我应该和DDE一起去吗?看来IDropHandler是我的选择。现在我要做的就是想办法。我已经在以下网站上询问了另一个问题以寻求帮助: