如何让我的文件关联在单个程序实例中打开多个文件?

时间:2010-08-31 03:52:33

标签: windows shell registry associations

我已在注册表中为我的程序as Windows requires设置了文件扩展名。

在注册表中,在shell / open /命令下,我有:

"C:\MyProgramPath\MyProgram.exe" "%1" 

这对我来说很好。当有人点击与我的应用程序关联的一个或多个文件时,我的应用程序会正确打开文件,但每个文件都在一个单独的程序实例中打开。

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

2 个答案:

答案 0 :(得分:4)

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

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

  1. 当您的程序(MyProgram.exe)启动时,应该检查是否已经有一个实例运行。
  2. 如果有前一个实例,MyProgram.exe的新实例应该向旧实例发送消息(某种类型,不一定是Windows消息),告诉它打开文件%1
  3. 新实例现在应该自行终止。
  4. 一种非常简单的方法

    有几种方法可以实现这一目标。最简单的方法之一是每次应用程序启动时设置一个注册表项/值,并在应用程序存在时将其删除。然后,当您的应用程序的(新实例)启动时,在设置此键/值之前,应检查它是否已设置。如果是,请按照上述步骤(2)和(3)进行操作。这可能不是最稳定的方法(实际上这是一个非常糟糕的主意,因为你不能保证应用程序会在它存在的情况下删除键/值,如果它不正常),但它会给你基本的想法。其他可能更好的方式包括FindWindow,甚至更好地使用mutexes

    第二步可以通过发送Windows消息(可能是WM_COPYDATA),或者通过设置注册表值,或者通过编写文件来实现,或者......在不同的进程之间有很多通信方式。

    详情

    由于这是一个相当普遍的问题,因此之前已经处理过了。例如,请参阅this Delphi-specific article

答案 1 :(得分:1)

您可以在使用DDE时使用。有关Delphi中的示例,请参阅http://cc.embarcadero.com/Item/17787

修改

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