如何一次将多个文件传递给我注册的应用程序?

在与 Windows 10 中的图形文件格式关联的 Delphi 10.4.2 win-32 VCL 应用程序中,我在 Windows 文件资源管理器中选择了参数文件。在这里,我立即观察传递给我的应用程序的文件Application.Initialize;

CodeSite.Send('AppInstances: ParamCount', ParamCount);

当我在资源管理器中选择一个文件然后按下ENTER键时,这个文件就会加载到我的应用程序中。到现在为止还挺好。

但是当我在资源管理器中选择三个文件然后按下ENTER键时,我的应用程序每次使用 3 个文件参数之一启动三次:

当我按下 Enter 键时,Explorer 是否可能只启动我的应用程序一次并一次将 3 个选定的文件传递给我的应用程序?

回答

在 Windows 7 和更高版本1 上,您可以在注册表中使用文件关联动词注册一个MultiSelectModel值(DocumentPlayer)。这是允许 Explorer 一次将多个文件发送到应用程序的单个实例的最简单方法,例如在单独的命令行参数中。

1:我不知道这个功能是什么时候首次引入的。

在 之前MultiSelectModel,处理此问题的其他方法包括:

  • IDropTarget在您的应用程序中实现接口,然后使用您的文件关联动词注册DropTarget。然后,Shell 可以构造一个IDataObject包含有关文件的信息,并将其传递给您的IDropTarget实现(另请参阅本文)。这是首选方法,因为它不受其他方法(包括MultiSelectModel!)的限制,并且它允许更大的灵活性,因为相同的IDropTarget实现可以接受在资源管理器中执行的多个文件,文件拖放到应用程序的窗口,甚至拖放到应用程序的窗口上应用程序的.EXE文件本身。只需将其注册IDropTarget到适当的 API 即可。

  • 在您的应用程序中实现 DDE 服务器,然后使用您的文件关联动词注册服务器。然后,Shell 可以与您的应用程序开始 DDE 对话,并使用您指定的命令将文件路径发送给它。

  • 只是接受 Shell 为每个文件启动一个单独的进程。在您的应用程序创建其 UI 之前,让其启动代码检查其命令行上的文件路径,如果找到,则查找已运行的应用程序的另一个实例,如果找到,则使用您选择的进程间通信机制(即,WM_COPYDATA命名管道、套接字、邮槽等)将文件路径发送到该现有实例,然后退出。


以上是如何一次将多个文件传递给我注册的应用程序?的全部内容。
THE END
分享
二维码
< <上一篇
)">
下一篇>>