我已在注册表中为我的程序as Windows requires设置了文件扩展名。
在注册表中,在shell / open /命令下,我有:
"C:\MyProgramPath\MyProgram.exe" "%1"
这对我来说很好。当有人点击与我的应用程序关联的一个或多个文件时,我的应用程序会正确打开文件,但每个文件都在一个单独的程序实例中打开。
我有什么办法可以在一个程序实例中打开所有文件吗?
答案 0 :(得分:4)
这是一个相当常见的问题,它实际上与Windows文件扩展名无关。当您双击程序自定义类型的文件时,Windows将启动关联的应用程序MyProgram.exe
并将文件名%1
作为命令行参数传递。
现在,如果您只想要应用程序的单个实例,则需要执行以下操作:
MyProgram.exe
)启动时,应该检查是否已经有一个实例运行。MyProgram.exe
的新实例应该向旧实例发送消息(某种类型,不一定是Windows消息),告诉它打开文件%1
。 有几种方法可以实现这一目标。最简单的方法之一是每次应用程序启动时设置一个注册表项/值,并在应用程序存在时将其删除。然后,当您的应用程序的(新实例)启动时,在设置此键/值之前,应检查它是否已设置。如果是,请按照上述步骤(2)和(3)进行操作。这可能不是最稳定的方法(实际上这是一个非常糟糕的主意,因为你不能保证应用程序会在它存在的情况下删除键/值,如果它不正常),但它会给你基本的想法。其他可能更好的方式包括FindWindow
,甚至更好地使用mutexes。
第二步可以通过发送Windows消息(可能是WM_COPYDATA
),或者通过设置注册表值,或者通过编写文件来实现,或者......在不同的进程之间有很多通信方式。
由于这是一个相当普遍的问题,因此之前已经处理过了。例如,请参阅this Delphi-specific article。
答案 1 :(得分:1)
您可以在使用DDE时使用。有关Delphi中的示例,请参阅http://cc.embarcadero.com/Item/17787。
修改强>
您提供的链接讨论了另一种方法:使用IDropTarget。这可能更适合您已经运行的拖放功能。