lke*_*ler 6 windows registry shell associations
我已根据Windows的要求在注册表中为我的程序设置了文件扩展名.
在注册表中,在shell/open/command下,我有:
"C:\MyProgramPath\MyProgram.exe" "%1"
Run Code Online (Sandbox Code Playgroud)
这对我来说很好.当有人点击与我的应用程序关联的一个或多个文件时,我的应用程序正确打开文件,但每个文件都在一个单独的程序实例中打开.
有什么方法可以做到这一点并打开一个程序实例中的所有文件?
这是一个相当普遍的问题,它实际上与 Windows 文件扩展名无关。当您双击程序自定义类型的文件时,Windows 将启动关联的应用程序MyProgram.exe
并将文件名%1
作为命令行参数传递。
现在,如果您只想要应用程序的单个实例,则需要执行以下操作:
MyProgram.exe
) 启动时,它应该检查是否已经有一个正在运行的实例。MyProgram.exe
应向旧实例发送一条消息(某种类型,不一定是 Windows 消息),告诉它打开文件%1
。有几种方法可以实现这一点。最简单的方法之一是在每次应用程序启动时设置一个注册表项/值,并在应用程序存在时将其删除。然后,当您的应用程序(的新实例)启动时,在设置此键/值之前,它应该检查它是否已经设置。如果是,请按照上述步骤 (2) 和 (3) 进行操作。这可能不是最稳定的方法(实际上这是一个非常糟糕的主意,因为如果应用程序异常存在,您无法保证它会删除键/值),但它会给您基本的想法。其他可能更好的方法包括FindWindow
使用互斥锁,甚至更好。
第二步可能通过发送windows消息(可能WM_COPYDATA
),或者通过设置注册表值,或者,通过写一个文件,或者…… 不同进程之间的通信方式有很多种。
由于这是一个相当普遍的问题,因此之前已经处理过。例如,请参阅这篇特定于Delphi 的文章。
使用DDE时可以。有关 Delphi 中的示例,请参阅http://cc.embarcadero.com/Item/17787 。
编辑:
您提供的链接讨论了另一种方法:使用 IDropTarget。这可能更适合您已经运行的拖放功能。
归档时间: |
|
查看次数: |
3326 次 |
最近记录: |